projects
/
model-checker-benchmarks.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
changes
[model-checker-benchmarks.git]
/
mpmc-queue
/
mpmc-queue.h
diff --git
a/mpmc-queue/mpmc-queue.h
b/mpmc-queue/mpmc-queue.h
index 2fe5ad1deb3234e0c726a2349f2fb272fb5a7209..fa5f37a1cf054634bdb4d9c152ef7299ed7f6b63 100644
(file)
--- a/
mpmc-queue/mpmc-queue.h
+++ b/
mpmc-queue/mpmc-queue.h
@@
-1,10
+1,13
@@
+#include <stdatomic.h>
+#include <unrelacy.h>
+
template <typename t_element, size_t t_size>
struct mpmc_boundq_1_alt
{
private:
// elements should generally be cache-line-size padded :
template <typename t_element, size_t t_size>
struct mpmc_boundq_1_alt
{
private:
// elements should generally be cache-line-size padded :
-
nonatomic<t_element>
m_array[t_size];
+
t_element
m_array[t_size];
// rdwr counts the reads & writes that have started
atomic<unsigned int> m_rdwr;
// rdwr counts the reads & writes that have started
atomic<unsigned int> m_rdwr;
@@
-14,45
+17,54
@@
private:
public:
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<t_element> * read_fetch() {
- unsigned int rdwr = m_rdwr($).load(mo_acquire);
+ 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(;;) {
rd = (rdwr>>16) & 0xFFFF;
wr = rdwr & 0xFFFF;
if ( wr == rd ) // empty
unsigned int rd,wr;
for(;;) {
rd = (rdwr>>16) & 0xFFFF;
wr = rdwr & 0xFFFF;
if ( wr == rd ) // empty
- return
false
;
-
- if ( m_rdwr
($)
.compare_exchange_weak(rdwr,rdwr+(1<<16),mo_acq_rel) )
+ return
NULL
;
+
+ if ( m_rdwr.compare_exchange_weak(rdwr,rdwr+(1<<16),mo_acq_rel) )
break;
break;
+ else
+ thrd_yield();
}
// (*1)
rl::backoff bo;
}
// (*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<t_element>
* p = & ( m_array[ rd % t_size ] );
+
t_element
* p = & ( m_array[ rd % t_size ] );
return p;
}
void read_consume() {
return p;
}
void read_consume() {
- m_read
($)
.fetch_add(1,mo_release);
+ m_read.fetch_add(1,mo_release);
}
//-----------------------------------------------------
}
//-----------------------------------------------------
- nonatomic<t_element> * write_prepare() {
- unsigned int rdwr = m_rdwr($).load(mo_acquire);
+ 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(;;) {
rd = (rdwr>>16) & 0xFFFF;
unsigned int rd,wr;
for(;;) {
rd = (rdwr>>16) & 0xFFFF;
@@
-61,24
+73,26
@@
public:
if ( wr == ((rd + t_size)&0xFFFF) ) // full
return NULL;
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;
break;
+ else
+ thrd_yield();
}
// (*1)
rl::backoff bo;
}
// (*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<t_element>
* p = & ( m_array[ wr % t_size ] );
+
t_element
* p = & ( m_array[ wr % t_size ] );
return p;
}
void write_publish()
{
return p;
}
void write_publish()
{
- m_written
($)
.fetch_add(1,mo_release);
+ m_written.fetch_add(1,mo_release);
}
//-----------------------------------------------------
}
//-----------------------------------------------------