mirror of
https://github.com/wolfpld/tracy.git
synced 2026-09-10 20:38:18 +00:00
Cherry-pick queue memory-ordering fixes from concurrentqueue v1.0.5.
This commit is contained in:
@@ -680,7 +680,7 @@ private:
|
||||
while (head != nullptr) {
|
||||
auto prevHead = head;
|
||||
auto refs = head->freeListRefs.load(std::memory_order_relaxed);
|
||||
if ((refs & REFS_MASK) == 0 || !head->freeListRefs.compare_exchange_strong(refs, refs + 1, std::memory_order_acquire, std::memory_order_relaxed)) {
|
||||
if ((refs & REFS_MASK) == 0 || !head->freeListRefs.compare_exchange_strong(refs, refs + 1, std::memory_order_acquire)) {
|
||||
head = freeListHead.load(std::memory_order_acquire);
|
||||
continue;
|
||||
}
|
||||
@@ -730,7 +730,7 @@ private:
|
||||
node->freeListRefs.store(1, std::memory_order_release);
|
||||
if (!freeListHead.compare_exchange_strong(head, node, std::memory_order_release, std::memory_order_relaxed)) {
|
||||
// Hmm, the add failed, but we can only try again when the refcount goes back to zero
|
||||
if (node->freeListRefs.fetch_add(SHOULD_BE_ON_FREELIST - 1, std::memory_order_release) == 1) {
|
||||
if (node->freeListRefs.fetch_add(SHOULD_BE_ON_FREELIST - 1, std::memory_order_acq_rel) == 1) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -794,7 +794,7 @@ private:
|
||||
}
|
||||
else {
|
||||
// Increment counter
|
||||
auto prevVal = elementsCompletelyDequeued.fetch_add(1, std::memory_order_release);
|
||||
auto prevVal = elementsCompletelyDequeued.fetch_add(1, std::memory_order_acq_rel);
|
||||
assert(prevVal < BLOCK_SIZE);
|
||||
return prevVal == BLOCK_SIZE - 1;
|
||||
}
|
||||
@@ -816,7 +816,7 @@ private:
|
||||
}
|
||||
else {
|
||||
// Increment counter
|
||||
auto prevVal = elementsCompletelyDequeued.fetch_add(count, std::memory_order_release);
|
||||
auto prevVal = elementsCompletelyDequeued.fetch_add(count, std::memory_order_acq_rel);
|
||||
assert(prevVal + count <= BLOCK_SIZE);
|
||||
return prevVal + count == BLOCK_SIZE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user