diff options
| author | kulikov <[email protected]> | 2025-11-28 00:32:45 +0300 |
|---|---|---|
| committer | kulikov <[email protected]> | 2025-11-28 00:47:44 +0300 |
| commit | 909e306757b2da405daed2e0838e11b65e033c1a (patch) | |
| tree | ede331912522813f6f0f60f594306feaa9589b30 /library/cpp/threading/thread_local/generic.cpp | |
| parent | 2a1c1d7670e335bc967a309eda2e0beac81332d7 (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.cpp | 22 |
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()(); } } |
