summaryrefslogtreecommitdiffstats
path: root/library/cpp/threading/thread_local/generic.cpp
diff options
context:
space:
mode:
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()();
}
}