From aaa5ab0a55c0b9758e59883dcffae248c6c52564 Mon Sep 17 00:00:00 2001 From: Determinant Date: Wed, 3 Apr 2019 01:58:28 -0400 Subject: fix bugs; clean up memory order for atomic ops --- include/salticidae/event.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'include/salticidae/event.h') diff --git a/include/salticidae/event.h b/include/salticidae/event.h index b97ab9a..641bb8e 100644 --- a/include/salticidae/event.h +++ b/include/salticidae/event.h @@ -426,7 +426,7 @@ class ThreadNotifier { cv.wait(ul, [this]{ return ready; }); return std::move(data); } - void notify(T &&_data) { + void notify(T &&_data) { mutex_lg_t _(mlock); ready = true; data = std::move(_data); @@ -481,7 +481,6 @@ class ThreadCall { } template void set_result(T &&data) { - std::atomic_thread_fence(std::memory_order_release); using _T = std::remove_reference_t; result = Result(new _T(std::forward(data)), [](void *ptr) {delete static_cast<_T *>(ptr);}); @@ -497,6 +496,7 @@ class ThreadCall { ev_listen = FdEvent(ec, ctl_fd[0], [this](int fd, int) { Handle *h; read(fd, &h, sizeof(h)); + std::atomic_thread_fence(std::memory_order_acquire); h->exec(); delete h; }); @@ -567,7 +567,7 @@ class MPSCQueueEventDriven: public MPSCQueue { // get to write(fd). Then store(true) must happen after all exchange(false), // since all enqueue operations are finalized, the dequeue should be able // to see those enqueued values in func() - wait_sig.store(true, std::memory_order_release); + wait_sig.exchange(true, std::memory_order_acq_rel); if (func(*this)) write(fd, &dummy, 8); }); @@ -631,7 +631,7 @@ class MPMCQueueEventDriven: public MPMCQueue { uint64_t t; if (read(fd, &t, 8) != 8) return; // only one consumer should be here a a time - wait_sig.store(true, std::memory_order_release); + wait_sig.exchange(true, std::memory_order_acq_rel); if (func(*this)) write(fd, &dummy, 8); }); -- cgit v1.2.3-70-g09d2