aboutsummaryrefslogtreecommitdiff
path: root/src/queue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/queue.cpp')
-rw-r--r--src/queue.cpp5
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;
}