+#include <unrelacy.h>
+
class eventcount
{
public:
void signal_relaxed()
{
- unsigned cmp = count($).load(std::memory_order_relaxed);
+ unsigned cmp = count.load(std::memory_order_relaxed);
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()
{
- unsigned cmp = count($).fetch_or(0x80000000,
+ unsigned cmp = count.fetch_or(0x80000000,
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($);
- ec = count($).load(std::memory_order_seq_cst);
+ ec = count.load(std::memory_order_seq_cst);
if (cmp == (ec & 0x7FFFFFFF))
{
- waiters($) += 1;
+ waiters += 1;
cv.wait(guard, $);
}
guard.unlock($);
if (cmp & 0x80000000)
{
guard.lock($);
- while (false == count($).compare_swap(cmp,
+ while (false == count.compare_swap(cmp,
(cmp + 1) & 0x7FFFFFFF, std::memory_order_relaxed));
unsigned w = waiters($);
- waiters($) = 0;
+ waiters = 0;
guard.unlock($);
if (w)
cv.notify_all($);
+#include <unrelacy.h>
+
#include "eventcount.h"
template<typename T>
spsc_queue()
{
node* n = RL_NEW node ();
- head($) = n;
- tail($) = n;
+ head = n;
+ tail = n;
}
~spsc_queue()
{
- RL_ASSERT(head($) == tail($));
+ RL_ASSERT(head == tail);
RL_DELETE((node*)head($));
}
void enqueue(T data)
{
node* n = RL_NEW node (data);
- head($)->next($).store(n, std::memory_order_release);
- head($) = n;
+ head($)->next.store(n, std::memory_order_release);
+ head = n;
ec.signal_relaxed();
}
T try_dequeue()
{
node* t = tail($);
- node* n = t->next($).load(std::memory_order_acquire);
+ node* n = t->next.load(std::memory_order_acquire);
if (0 == n)
return 0;
T data = n->data($);
RL_DELETE(t);
- tail($) = n;
+ tail = n;
return data;
}
};