All benchmarks now call thrd_yield when appropriate so that they terminate with the -y option.
} else {
/* Run in circles and scream like a little girl. */
while (step_.load () == step)
} else {
/* Run in circles and scream like a little girl. */
while (step_.load () == step)
TESTS+=" mpmc-queue/mpmc-queue-noinit"
TESTS+=" linuxrwlocks/linuxrwlocks"
TESTS+=" mpmc-queue/mpmc-queue-noinit"
TESTS+=" linuxrwlocks/linuxrwlocks"
-MODEL_ARGS="-f 10 -m 2 -e 1"
COUNT=0
function run_test {
COUNT=0
function run_test {
flag0.store(false,std::memory_order_relaxed);
while (turn.load(std::memory_order_relaxed) != 0)
{
flag0.store(false,std::memory_order_relaxed);
while (turn.load(std::memory_order_relaxed) != 0)
{
}
flag0.store(true,std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_seq_cst);
}
flag0.store(true,std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_seq_cst);
}
std::atomic_thread_fence(std::memory_order_acquire);
}
std::atomic_thread_fence(std::memory_order_acquire);
flag1.store(false,std::memory_order_relaxed);
while (turn.load(std::memory_order_relaxed) != 1)
{
flag1.store(false,std::memory_order_relaxed);
while (turn.load(std::memory_order_relaxed) != 1)
{
}
flag1.store(true,std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_seq_cst);
}
flag1.store(true,std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_seq_cst);
}
std::atomic_thread_fence(std::memory_order_acquire);
}
std::atomic_thread_fence(std::memory_order_acquire);
int priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
while (priorvalue <= 0) {
atomic_fetch_add_explicit(&rw->lock, 1, memory_order_relaxed);
int priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
while (priorvalue <= 0) {
atomic_fetch_add_explicit(&rw->lock, 1, memory_order_relaxed);
- do {
- priorvalue = atomic_load_explicit(&rw->lock, memory_order_relaxed);
- } while (priorvalue <= 0);
+ while (atomic_load_explicit(&rw->lock, memory_order_relaxed) <= 0) {
+ thrd_yield();
+ }
priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
}
}
priorvalue = atomic_fetch_sub_explicit(&rw->lock, 1, memory_order_acquire);
}
}
int priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
while (priorvalue != RW_LOCK_BIAS) {
atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_relaxed);
int priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
while (priorvalue != RW_LOCK_BIAS) {
atomic_fetch_add_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_relaxed);
- do {
- priorvalue = atomic_load_explicit(&rw->lock, memory_order_relaxed);
- } while (priorvalue != RW_LOCK_BIAS);
+ while (atomic_load_explicit(&rw->lock, memory_order_relaxed) != RW_LOCK_BIAS) {
+ thrd_yield();
+ }
priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
}
}
priorvalue = atomic_fetch_sub_explicit(&rw->lock, RW_LOCK_BIAS, memory_order_acquire);
}
}
// wait on predecessor setting my flag -
rl::linear_backoff bo;
while ( me->gate.load(std::mo_acquire) ) {
// wait on predecessor setting my flag -
rl::linear_backoff bo;
while ( me->gate.load(std::mo_acquire) ) {
next = me->next.load(std::mo_acquire);
if ( next != NULL )
break;
next = me->next.load(std::mo_acquire);
if ( next != NULL )
break;
// (*1)
rl::backoff bo;
while ( (m_written.load(mo_acquire) & 0xFFFF) != wr ) {
// (*1)
rl::backoff bo;
while ( (m_written.load(mo_acquire) & 0xFFFF) != wr ) {
}
t_element * p = & ( m_array[ rd % t_size ] );
}
t_element * p = & ( m_array[ rd % t_size ] );
// (*1)
rl::backoff bo;
while ( (m_read.load(mo_acquire) & 0xFFFF) != rd ) {
// (*1)
rl::backoff bo;
while ( (m_read.load(mo_acquire) & 0xFFFF) != rd ) {
}
t_element * p = & ( m_array[ wr % t_size ] );
}
t_element * p = & ( m_array[ wr % t_size ] );