aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkulikov <kulikov@yandex-team.com>2024-09-12 19:28:16 +0300
committerkulikov <kulikov@yandex-team.com>2024-09-12 19:43:48 +0300
commit20a8c1bdb3377f5cb86adc3173d7a329245ebaa1 (patch)
tree2252acf3ab8803ed742b2e35386aaa31e28a8fca
parent06218aa8d37f8624a4caeff1be3f59217b162158 (diff)
downloadydb-20a8c1bdb3377f5cb86adc3173d7a329245ebaa1.tar.gz
fix tsan warnings in library/cpp/threading unit tests
- blocking_counter: fix destroy order; - thread_local: Head_.load must use std::memory_order_acquire to match memory_order_release in compare_exchange and ensure all writes are visible; also fix always null node value in first compare_exchange call; - work_stealing: use atomics. commit_hash:53f01a16bb40dd3eb890b0eb60388ecb0ce9c908
-rw-r--r--library/cpp/threading/thread_local/thread_local.h10
1 files changed, 5 insertions, 5 deletions
diff --git a/library/cpp/threading/thread_local/thread_local.h b/library/cpp/threading/thread_local/thread_local.h
index 1cc4642373..bb0d11347d 100644
--- a/library/cpp/threading/thread_local/thread_local.h
+++ b/library/cpp/threading/thread_local/thread_local.h
@@ -222,16 +222,16 @@ public:
template <typename ...ConsturctArgs>
T* Get(TThread::TId tid, ConsturctArgs&& ...args) {
- TNode* node = Head_.load(std::memory_order_relaxed);
- for (; node; node = node->Next) {
+ TNode* head = Head_.load(std::memory_order_acquire);
+ for (TNode* node = head; node; node = node->Next) {
if (node->Key == tid) {
return &node->Value;
}
}
- TNode* newNode = AllocateNode(tid, node, std::forward<ConsturctArgs>(args)...);
- while (!Head_.compare_exchange_weak(node, newNode, std::memory_order_release, std::memory_order_relaxed)) {
- newNode->Next = node;
+ TNode* newNode = AllocateNode(tid, head, std::forward<ConsturctArgs>(args)...);
+ while (!Head_.compare_exchange_weak(head, newNode, std::memory_order_release, std::memory_order_relaxed)) {
+ newNode->Next = head;
}
return &newNode->Value;