summaryrefslogtreecommitdiffstats
path: root/library/cpp/threading/thread_local/generic.cpp
diff options
context:
space:
mode:
authorkulikov <[email protected]>2025-11-28 00:32:45 +0300
committerkulikov <[email protected]>2025-11-28 00:47:44 +0300
commit909e306757b2da405daed2e0838e11b65e033c1a (patch)
treeede331912522813f6f0f60f594306feaa9589b30 /library/cpp/threading/thread_local/generic.cpp
parent2a1c1d7670e335bc967a309eda2e0beac81332d7 (diff)
Use generic thread-local value for kernel/groupattrs, crash context and eventlog scope
- fix StdThreadLocalImpl -- make static state refcounted, there is no guarantee that static fields will outlive threads or TThreadLocalValues; - replace thread local values to generic local storage value in some places; - call runtime Init and replace local values factory; - don't disable NCurrentThreadEventlog for ytxx runtime, it should now work; - ensure generic local storage values are allocated after runtime init; - use function-scope static variables to prevent issues with order of construction and destruction; - basesearch now almost works with coroutines (with NProfile disabled). commit_hash:7fde81591b0dbc3a53b8d1cb11bb96930a2e9a80
Diffstat (limited to 'library/cpp/threading/thread_local/generic.cpp')
-rw-r--r--library/cpp/threading/thread_local/generic.cpp22
1 files changed, 17 insertions, 5 deletions
diff --git a/library/cpp/threading/thread_local/generic.cpp b/library/cpp/threading/thread_local/generic.cpp
index 41e1b381672..79161a846da 100644
--- a/library/cpp/threading/thread_local/generic.cpp
+++ b/library/cpp/threading/thread_local/generic.cpp
@@ -14,17 +14,29 @@ namespace {
NThreading::TThreadLocalValue<TData, NThreading::EThreadLocalImpl::StdThreadLocal> Data_;
};
- NThreading::TGenericLocalStorageFactory genericLocalStorageFactory = []() {
- return MakeHolder<TThreadLocalStorage>();
- };
+ std::atomic<size_t>& DefaultFactoryUsageCounter() {
+ static std::atomic<size_t> v;
+ return v;
+ }
+
+ auto& genericLocalStorageFactory() {
+ static NThreading::TGenericLocalStorageFactory factory = [] {
+ DefaultFactoryUsageCounter() += 1;
+ return MakeHolder<TThreadLocalStorage>();
+ };
+
+ return factory;
+ }
}
namespace NThreading {
void SetGenericLocalStorageFactory(TGenericLocalStorageFactory factory) {
- genericLocalStorageFactory = factory;
+ Y_ENSURE(DefaultFactoryUsageCounter() == 0, "There are some thread local values allocated with default factory");
+
+ genericLocalStorageFactory() = factory;
}
THolder<IGenericLocalStorage> MakeGenericLocalStorage() {
- return genericLocalStorageFactory();
+ return genericLocalStorageFactory()();
}
}