diff options
Diffstat (limited to 'src/queue.cpp')
| -rw-r--r-- | src/queue.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/queue.cpp b/src/queue.cpp index 845f87310..d3fd69c52 100644 --- a/src/queue.cpp +++ b/src/queue.cpp @@ -69,10 +69,13 @@ gb_internal bool mpsc_dequeue(MPSCQueue<T> *q, T *value_) { if (next) { q->tail.store(next, std::memory_order_relaxed); // `tail` is now "dead" and needs to be "freed" - if (*value_) *value_ = next->value; + tail->value = next->value; + T value = tail->value; + if (value_) *value_ = value; q->count.fetch_sub(1, std::memory_order_acq_rel); return true; } + GB_ASSERT(q->count.load(std::memory_order_acquire) == 0); return false; } |