#include "generic.h" #include "thread_local.h" namespace { class TThreadLocalStorage : public NThreading::IGenericLocalStorage { public: TData* GetData() const override { return Data_.Get(); } private: NThreading::TThreadLocalValue Data_; }; std::atomic& DefaultFactoryUsageCounter() { static std::atomic v; return v; } auto& genericLocalStorageFactory() { static NThreading::TGenericLocalStorageFactory factory = [] { DefaultFactoryUsageCounter() += 1; return MakeHolder(); }; return factory; } } namespace NThreading { void SetGenericLocalStorageFactory(TGenericLocalStorageFactory factory) { Y_ENSURE(DefaultFactoryUsageCounter() == 0, "There are some thread local values allocated with default factory"); genericLocalStorageFactory() = factory; } THolder MakeGenericLocalStorage() { return genericLocalStorageFactory()(); } }