X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker-benchmarks.git;a=blobdiff_plain;f=mpmc-queue%2Fmpmc-queue.h;h=918415fa99278e0a8cc3d47622f84de00749445c;hp=bef0f324cfc368e94533eb67e509b5787074f354;hb=77847ecd3fa6a643302770491928787ba143cde1;hpb=1261596fb5b7aa16bc7bc98489d470c3d24fa849;ds=sidebyside diff --git a/mpmc-queue/mpmc-queue.h b/mpmc-queue/mpmc-queue.h index bef0f32..918415f 100644 --- a/mpmc-queue/mpmc-queue.h +++ b/mpmc-queue/mpmc-queue.h @@ -7,7 +7,7 @@ struct mpmc_boundq_1_alt private: // elements should generally be cache-line-size padded : - nonatomic m_array[t_size]; + t_element m_array[t_size]; // rdwr counts the reads & writes that have started atomic m_rdwr; @@ -17,13 +17,16 @@ private: public: - mpmc_boundq_1_alt() : m_rdwr(0), m_read(0), m_written(0) + mpmc_boundq_1_alt() { + m_rdwr = 0; + m_read = 0; + m_written = 0; } //----------------------------------------------------- - nonatomic * read_fetch() { + t_element * read_fetch() { unsigned int rdwr = m_rdwr.load(mo_acquire); unsigned int rd,wr; for(;;) { @@ -35,15 +38,17 @@ public: 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(); } - nonatomic * p = & ( m_array[ rd % t_size ] ); + t_element * p = & ( m_array[ rd % t_size ] ); return p; } @@ -54,7 +59,7 @@ public: //----------------------------------------------------- - nonatomic * write_prepare() { + t_element * write_prepare() { unsigned int rdwr = m_rdwr.load(mo_acquire); unsigned int rd,wr; for(;;) { @@ -66,15 +71,17 @@ 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(); } - nonatomic * p = & ( m_array[ wr % t_size ] ); + t_element * p = & ( m_array[ wr % t_size ] ); return p; }