X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=mpmc-queue%2Fmpmc-queue.h;h=47af8eab37b7509ca8e257e118c5b7e38ec8278a;hb=5ab6d890042234648c0baec333ed65e90ca055cf;hp=2fe5ad1deb3234e0c726a2349f2fb272fb5a7209;hpb=62388a2f7263a9ee49226dbf4328e2677b07f0d7;p=model-checker-benchmarks.git diff --git a/mpmc-queue/mpmc-queue.h b/mpmc-queue/mpmc-queue.h index 2fe5ad1..47af8ea 100644 --- a/mpmc-queue/mpmc-queue.h +++ b/mpmc-queue/mpmc-queue.h @@ -1,10 +1,13 @@ +#include +#include + template 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; @@ -14,45 +17,50 @@ 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() { - unsigned int rdwr = m_rdwr($).load(mo_acquire); + t_element * read_fetch() { + unsigned int rdwr = m_rdwr.load(mo_acquire); unsigned int rd,wr; for(;;) { rd = (rdwr>>16) & 0xFFFF; wr = rdwr & 0xFFFF; if ( wr == rd ) // empty - return false; + return NULL; - if ( m_rdwr($).compare_exchange_weak(rdwr,rdwr+(1<<16),mo_acq_rel) ) + 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($); + while ( (m_written.load(mo_acquire) & 0xFFFF) != wr ) { + thrd_yield(); } - nonatomic * p = & ( m_array[ rd % t_size ] ); + t_element * p = & ( m_array[ rd % t_size ] ); return p; } void read_consume() { - m_read($).fetch_add(1,mo_release); + m_read.fetch_add(1,mo_release); } //----------------------------------------------------- - nonatomic * write_prepare() { - unsigned int rdwr = m_rdwr($).load(mo_acquire); + t_element * write_prepare() { + unsigned int rdwr = m_rdwr.load(mo_acquire); unsigned int rd,wr; for(;;) { rd = (rdwr>>16) & 0xFFFF; @@ -61,24 +69,26 @@ public: if ( wr == ((rd + t_size)&0xFFFF) ) // full return NULL; - if ( m_rdwr($).compare_exchange_weak(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($); + while ( (m_read.load(mo_acquire) & 0xFFFF) != rd ) { + thrd_yield(); } - nonatomic * p = & ( m_array[ wr % t_size ] ); + t_element * p = & ( m_array[ wr % t_size ] ); return p; } void write_publish() { - m_written($).fetch_add(1,mo_release); + m_written.fetch_add(1,mo_release); } //-----------------------------------------------------