#pragma once #include namespace NTSAN { template inline void RelaxedStore(volatile T* a, T x) { static_assert(std::is_integral::value || std::is_pointer::value, "expect std::is_integral::value || std::is_pointer::value"); #ifdef _win_ *a = x; #else __atomic_store_n(a, x, __ATOMIC_RELAXED); #endif } template inline T RelaxedLoad(volatile T* a) { #ifdef _win_ return *a; #else return __atomic_load_n(a, __ATOMIC_RELAXED); #endif } } void SetCurrentThreadName(const char* name); namespace NThreadExtra { namespace NPrivate { template struct TValueHolder { TValue Value; }; } } template static inline TValue* FastTlsSingletonWithTag() { return &FastTlsSingleton< ::NThreadExtra::NPrivate::TValueHolder>()->Value; }