projects
/
model-checker-benchmarks.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
spsc-queue: fixup atomics, mutexes, threads
[model-checker-benchmarks.git]
/
spsc-queue
/
eventcount.h
diff --git
a/spsc-queue/eventcount.h
b/spsc-queue/eventcount.h
index f64946a556138500880f12684e0321802accf86f..bf1f511a7fb3ec4249a2400b6c6ab8640448bacd 100644
(file)
--- a/
spsc-queue/eventcount.h
+++ b/
spsc-queue/eventcount.h
@@
-1,12
+1,14
@@
#include <unrelacy.h>
#include <unrelacy.h>
+#include <atomic>
+#include <mutex>
class eventcount
{
public:
class eventcount
{
public:
- eventcount()
- : count(0)
- , waiters(0)
-
{
}
+ eventcount()
: waiters(0)
+ {
+ count = 0;
+ }
void signal_relaxed()
{
void signal_relaxed()
{
@@
-46,7
+48,7
@@
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;
+
std::
mutex guard;
condition_variable_any cv;
void signal_impl(unsigned cmp)
condition_variable_any cv;
void signal_impl(unsigned cmp)
@@
-54,7
+56,7
@@
private:
if (cmp & 0x80000000)
{
guard.lock($);
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($);
waiters = 0;
(cmp + 1) & 0x7FFFFFFF, std::memory_order_relaxed));
unsigned w = waiters($);
waiters = 0;