mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-29 01:14:40 +00:00
Correct mpsc_dequeue
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user