X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=mpmc-queue%2Fmpmc-queue.h;h=fa5f37a1cf054634bdb4d9c152ef7299ed7f6b63;hb=1438eb7c0715e53611a717e593bfa3fe1bd30588;hp=f73ab992e0b1fcfbbf962b067c204cdb75b9578f;hpb=ca67665a06590d48352fd2c601004a39bd993ca8;p=model-checker-benchmarks.git diff --git a/mpmc-queue/mpmc-queue.h b/mpmc-queue/mpmc-queue.h index f73ab99..fa5f37a 100644 --- a/mpmc-queue/mpmc-queue.h +++ b/mpmc-queue/mpmc-queue.h @@ -27,6 +27,8 @@ public: //----------------------------------------------------- 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(;;) { @@ -34,16 +36,18 @@ public: wr = rdwr & 0xFFFF; if ( wr == rd ) // empty - return false; - + 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 ] ); @@ -58,6 +62,8 @@ public: //----------------------------------------------------- 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(;;) { @@ -69,12 +75,14 @@ public: 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 ] );