diff options
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()(); } } |
