/usr/local/lib64/python3.6/site-packages/torch/include/c10/util
NameSizeModeActions
accumulate.h42050644editdlrm
AlignOf.h48350644editdlrm
Array.h113540644editdlrm
ArrayRef.h90580644editdlrm
Backtrace.h3640644editdlrm
BFloat16-inl.h92220644editdlrm
BFloat16-math.h52170644editdlrm
BFloat16.h23720644editdlrm
Bitset.h34140644editdlrm
C++17.h133290644editdlrm
complex.h175420644editdlrm
complex_math.h109020644editdlrm
complex_utils.h9580644editdlrm
ConstexprCrc.h66330644editdlrm
copysign.h8660644editdlrm
DeadlockDetection.h19200644editdlrm
Deprecated.h35790644editdlrm
either.h64230644editdlrm
env.h8350644editdlrm
Exception.h247230644editdlrm
ExclusivelyOwned.h47590644editdlrm
Flags.h100560644editdlrm
flat_hash_map.h616550644editdlrm
FunctionRef.h23010644editdlrm
Half-inl.h86740644editdlrm
Half.h189650644editdlrm
hash.h50840644editdlrm
IdWrapper.h23480644editdlrm
intrusive_ptr.h355630644editdlrm
in_place.h3500644editdlrm
irange.h26790644editdlrm
LeftRight.h60160644editdlrm
llvmMathExtras.h291680644editdlrm
Logging.h112560644editdlrm
logging_is_google_glog.h20310644editdlrm
logging_is_not_google_glog.h82710644editdlrm
MathConstants.h8580644editdlrm
math_compat.h72960644editdlrm
MaybeOwned.h66890644editdlrm
Metaprogramming.h152880644editdlrm
numa.h6960644editdlrm
Optional.h355920644editdlrm
order_preserving_flat_hash_map.h654820644editdlrm
overloaded.h7090644editdlrm
python_stub.h560644editdlrm
qint8.h4720644editdlrm
qint32.h3190644editdlrm
quint4x2.h3660644editdlrm
quint8.h3200644editdlrm
Registry.h122420644editdlrm
reverse_iterator.h87960644editdlrm
ScopeExit.h13450644editdlrm
signal_handler.h31540644editdlrm
SmallBuffer.h12430644editdlrm
SmallVector.h344560644editdlrm
sparse_bitset.h265110644editdlrm
StringUtil.h45380644editdlrm
string_utils.h39890644editdlrm
string_view.h201890644editdlrm
tempfile.h60290644editdlrm
ThreadLocal.h38830644editdlrm
ThreadLocalDebugInfo.h26030644editdlrm
thread_name.h1480644editdlrm
Type.h6070644editdlrm
TypeCast.h69720644editdlrm
typeid.h187930644editdlrm
TypeIndex.h52510644editdlrm
TypeList.h169010644editdlrm
TypeTraits.h53680644editdlrm
Unicode.h2950644editdlrm
UniqueVoidPtr.h41170644editdlrm
Unroll.h6670644editdlrm
variant.h951820644editdlrm
win32-headers.h8580644editdlrm
Edit: /usr/local/lib64/python3.6/site-packages/torch/include/c10/util/ThreadLocal.h (3883B)
#pragma once #include /** * Android versions with libgnustl incorrectly handle thread_local C++ * qualifier with composite types. NDK up to r17 version is affected. * * (A fix landed on Jun 4 2018: * https://android-review.googlesource.com/c/toolchain/gcc/+/683601) * * In such cases, use c10::ThreadLocal wrapper * which is `pthread_*` based with smart pointer semantics. * * In addition, convenient macro C10_DEFINE_TLS_static is available. * To define static TLS variable of type std::string, do the following * ``` * C10_DEFINE_TLS_static(std::string, str_tls_); * /////// * { * *str_tls_ = "abc"; * assert(str_tls_->length(), 3); * } * ``` * * (see c10/test/util/ThreadLocal_test.cpp for more examples) */ #if !defined(C10_PREFER_CUSTOM_THREAD_LOCAL_STORAGE) #if defined(C10_ANDROID) && defined(__GLIBCXX__) && __GLIBCXX__ < 20180604 #define C10_PREFER_CUSTOM_THREAD_LOCAL_STORAGE #endif // defined(C10_ANDROID) && defined(__GLIBCXX__) && __GLIBCXX__ < 20180604 #endif // !defined(C10_PREFER_CUSTOM_THREAD_LOCAL_STORAGE) #if defined(C10_PREFER_CUSTOM_THREAD_LOCAL_STORAGE) #include #include #include #include namespace c10 { /** * @brief Temporary thread_local C++ qualifier replacement for Android * based on `pthread_*`. * To be used with composite types that provide default ctor. */ template class ThreadLocal { public: ThreadLocal() { pthread_key_create( &key_, [](void* buf) { delete static_cast(buf); }); } ~ThreadLocal() { if (void* current = pthread_getspecific(key_)) { delete static_cast(current); } pthread_key_delete(key_); } ThreadLocal(const ThreadLocal&) = delete; ThreadLocal& operator=(const ThreadLocal&) = delete; Type& get() { if (void* current = pthread_getspecific(key_)) { return *static_cast(current); } std::unique_ptr ptr = std::make_unique(); if (0 == pthread_setspecific(key_, ptr.get())) { return *ptr.release(); } int err = errno; TORCH_INTERNAL_ASSERT(false, "pthread_setspecific() failed, errno = ", err); } Type& operator*() { return get(); } Type* operator->() { return &get(); } private: pthread_key_t key_; }; } // namespace c10 #define C10_DEFINE_TLS_static(Type, Name) static ::c10::ThreadLocal Name #define C10_DECLARE_TLS_class_static(Class, Type, Name) \ static ::c10::ThreadLocal Name #define C10_DEFINE_TLS_class_static(Class, Type, Name) \ ::c10::ThreadLocal Class::Name #else // defined(C10_PREFER_CUSTOM_THREAD_LOCAL_STORAGE) namespace c10 { /** * @brief Default thread_local implementation for non-Android cases. * To be used with composite types that provide default ctor. */ template class ThreadLocal { public: using Accessor = Type* (*)(); explicit ThreadLocal(Accessor accessor) : accessor_(accessor) {} ThreadLocal(const ThreadLocal&) = delete; ThreadLocal& operator=(const ThreadLocal&) = delete; Type& get() { return *accessor_(); } Type& operator*() { return get(); } Type* operator->() { return &get(); } private: Accessor accessor_; }; } // namespace c10 #define C10_DEFINE_TLS_static(Type, Name) \ static ::c10::ThreadLocal Name([]() { \ static thread_local Type var; \ return &var; \ }) #define C10_DECLARE_TLS_class_static(Class, Type, Name) \ static ::c10::ThreadLocal Name #define C10_DEFINE_TLS_class_static(Class, Type, Name) \ ::c10::ThreadLocal Class::Name([]() { \ static thread_local Type var; \ return &var; \ }) #endif // defined(C10_PREFER_CUSTOM_THREAD_LOCAL_STORAGE)