//-----------------------------------------------------
t_element * read_fetch() {
+ // FIXME: We can have a relaxed for sure here since the next CAS
+ // will fix the problem
unsigned int rdwr = m_rdwr.load(mo_acquire);
unsigned int rd,wr;
for(;;) {
wr = rdwr & 0xFFFF;
if ( wr == rd ) // empty
- return false;
-
- if ( m_rdwr.compare_exchange(rdwr,rdwr+(1<<16),mo_acq_rel) )
+ return NULL;
+
+ if ( m_rdwr.compare_exchange_weak(rdwr,rdwr+(1<<16),mo_acq_rel) )
break;
+ else
+ thrd_yield();
}
// (*1)
rl::backoff bo;
while ( (m_written.load(mo_acquire) & 0xFFFF) != wr ) {
- bo.yield();
+ thrd_yield();
}
t_element * p = & ( m_array[ rd % t_size ] );
//-----------------------------------------------------
t_element * write_prepare() {
+ // FIXME: We can have a relaxed for sure here since the next CAS
+ // will fix the problem
unsigned int rdwr = m_rdwr.load(mo_acquire);
unsigned int rd,wr;
for(;;) {
if ( wr == ((rd + t_size)&0xFFFF) ) // full
return NULL;
- if ( m_rdwr.compare_exchange(rdwr,(rd<<16) | ((wr+1)&0xFFFF),mo_acq_rel) )
+ if ( m_rdwr.compare_exchange_weak(rdwr,(rd<<16) | ((wr+1)&0xFFFF),mo_acq_rel) )
break;
+ else
+ thrd_yield();
}
// (*1)
rl::backoff bo;
while ( (m_read.load(mo_acquire) & 0xFFFF) != rd ) {
- bo.yield();
+ thrd_yield();
}
t_element * p = & ( m_array[ wr % t_size ] );