projects
/
model-checker-benchmarks.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
bench.sh: only print git information when we're in git
[model-checker-benchmarks.git]
/
spsc-queue
/
eventcount.h
diff --git
a/spsc-queue/eventcount.h
b/spsc-queue/eventcount.h
index 226603e7b9b3555ddbd7e436fdb7611d555736b6..aec3e8c9b216b9d71c9b561287d7d95828386f1a 100644
(file)
--- a/
spsc-queue/eventcount.h
+++ b/
spsc-queue/eventcount.h
@@
-1,41
+1,46
@@
+#include <unrelacy.h>
+#include <atomic>
+#include <mutex>
+#include <condition_variable>
+
class eventcount
{
public:
class eventcount
{
public:
- eventcount()
- : count(0)
- , waiters(0)
-
{
}
+ eventcount()
: waiters(0)
+ {
+ count = 0;
+ }
void signal_relaxed()
{
void signal_relaxed()
{
- unsigned cmp = count
($)
.load(std::memory_order_relaxed);
+ unsigned cmp = count.load(std::memory_order_relaxed);
signal_impl(cmp);
}
void signal()
{
signal_impl(cmp);
}
void signal()
{
- unsigned cmp = count
($)
.fetch_add(0, std::memory_order_seq_cst);
+ unsigned cmp = count.fetch_add(0, std::memory_order_seq_cst);
signal_impl(cmp);
}
unsigned get()
{
signal_impl(cmp);
}
unsigned get()
{
- unsigned cmp = count
($)
.fetch_or(0x80000000,
+ unsigned cmp = count.fetch_or(0x80000000,
std::memory_order_seq_cst);
return cmp & 0x7FFFFFFF;
}
void wait(unsigned cmp)
{
std::memory_order_seq_cst);
return cmp & 0x7FFFFFFF;
}
void wait(unsigned cmp)
{
- unsigned ec = count
($)
.load(std::memory_order_seq_cst);
+ unsigned ec = count.load(std::memory_order_seq_cst);
if (cmp == (ec & 0x7FFFFFFF))
{
guard.lock($);
if (cmp == (ec & 0x7FFFFFFF))
{
guard.lock($);
- ec = count
($)
.load(std::memory_order_seq_cst);
+ ec = count.load(std::memory_order_seq_cst);
if (cmp == (ec & 0x7FFFFFFF))
{
if (cmp == (ec & 0x7FFFFFFF))
{
- waiters
($)
+= 1;
- cv.wait(guard
, $
);
+ waiters += 1;
+ cv.wait(guard);
}
guard.unlock($);
}
}
guard.unlock($);
}
@@
-44,18
+49,18
@@
std::memory_order_seq_cst);
private:
std::atomic<unsigned> count;
rl::var<unsigned> waiters;
private:
std::atomic<unsigned> count;
rl::var<unsigned> waiters;
- mutex guard;
-
condition_variable_any
cv;
+
std::
mutex guard;
+
std::condition_variable
cv;
void signal_impl(unsigned cmp)
{
if (cmp & 0x80000000)
{
guard.lock($);
void signal_impl(unsigned cmp)
{
if (cmp & 0x80000000)
{
guard.lock($);
- while (false == count
($).compare_swap
(cmp,
+ while (false == count
.compare_exchange_weak
(cmp,
(cmp + 1) & 0x7FFFFFFF, std::memory_order_relaxed));
unsigned w = waiters($);
(cmp + 1) & 0x7FFFFFFF, std::memory_order_relaxed));
unsigned w = waiters($);
- waiters
($)
= 0;
+ waiters = 0;
guard.unlock($);
if (w)
cv.notify_all($);
guard.unlock($);
if (w)
cv.notify_all($);