edits
[model-checker-benchmarks.git] / mpmc-queue / mpmc-queue.h
index f73ab992e0b1fcfbbf962b067c204cdb75b9578f..fa5f37a1cf054634bdb4d9c152ef7299ed7f6b63 100644 (file)
@@ -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 ] );