4 #include <cds/algo/atomic.h>
6 #if CDS_OS_INTERFACE == CDS_OSI_WINDOWS
7 # if CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL
8 # include <cds/threading/details/msvc_manager.h>
10 # include <cds/threading/details/wintls_manager.h>
11 #else // CDS_OS_INTERFACE != CDS_OSI_WINDOWS
12 # if CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG || CDS_COMPILER == CDS_COMPILER_INTEL
13 # include <cds/threading/details/gcc_manager.h>
15 # include <cds/threading/details/pthread_manager.h>
18 #ifdef CDS_CXX11_THREAD_LOCAL_SUPPORT
19 # include <cds/threading/details/cxx11_manager.h>
24 CDS_EXPORT_API atomics::atomic<size_t> threading::ThreadData::s_nLastUsedProcNo(0);
25 CDS_EXPORT_API size_t threading::ThreadData::s_nProcCount = 1;
27 #if CDS_OS_INTERFACE == CDS_OSI_WINDOWS
28 CDS_EXPORT_API DWORD cds::threading::wintls::Manager::Holder::m_key = TLS_OUT_OF_INDEXES;
30 __declspec( thread ) threading::msvc_internal::ThreadDataPlaceholder threading::msvc_internal::s_threadData;
31 __declspec(thread) threading::ThreadData * threading::msvc_internal::s_pThreadData = nullptr;
34 pthread_key_t threading::pthread::Manager::Holder::m_key;
36 # if CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG
37 __thread threading::gcc_internal::ThreadDataPlaceholder CDS_DATA_ALIGNMENT(8) threading::gcc_internal::s_threadData;
38 __thread threading::ThreadData * threading::gcc_internal::s_pThreadData = nullptr;
42 #ifdef CDS_CXX11_THREAD_LOCAL_SUPPORT
43 thread_local threading::cxx11_internal::ThreadDataPlaceholder CDS_DATA_ALIGNMENT(8) threading::cxx11_internal::s_threadData;
44 thread_local threading::ThreadData * threading::cxx11_internal::s_pThreadData = nullptr;
48 static atomics::atomic<size_t> s_nInitCallCount(0);
50 bool CDS_EXPORT_API init_first_call()
52 return s_nInitCallCount.fetch_add(1, atomics::memory_order_relaxed) == 0;
55 bool CDS_EXPORT_API fini_last_call()
57 if ( s_nInitCallCount.fetch_sub( 1, atomics::memory_order_relaxed ) == 1 ) {
58 atomics::atomic_thread_fence( atomics::memory_order_release );
63 } // namespace details