55#ifndef ROOT_ThreadLocalStorage
56#define ROOT_ThreadLocalStorage
66#include "RConfigure.h"
69# if defined(__clang__) && defined(MAC_OS_X_VERSION_10_7) && (defined(__x86_64__) || defined(__i386__))
70# define R__HAS___THREAD
71# elif !defined(R__HAS_PTHREAD)
72# define R__HAS_PTHREAD
76# define R__HAS___THREAD
78#if defined(R__SOLARIS) && !defined(R__HAS_PTHREAD)
79# define R__HAS_PTHREAD
82# define R__HAS_DECLSPEC_THREAD
85# define R__HAS_PTHREAD
93# define TTHREAD_TLS(type) thread_local type
94# define TTHREAD_TLS_ARRAY(type,size,name) thread_local type name[size]
95# define TTHREAD_TLS_PTR(name) &name
97# define TTHREAD_TLS_DECL(type, name) thread_local type name
98# define TTHREAD_TLS_DECL_ARG(type, name, arg) thread_local type name(arg)
99# define TTHREAD_TLS_DECL_ARG2(type, name, arg1, arg2) thread_local type name(arg1,arg2)
107#define TTHREAD_TLS_DECL_IMPL(type, name, ptr, arg) \
108 TTHREAD_TLS(type *) ptr = 0; \
109 if (!ptr) ptr = new type(arg); \
112#define TTHREAD_TLS_DECL_IMPL2(type, name, ptr, arg1, arg2) \
113 TTHREAD_TLS(type *) ptr = 0; \
114 if (!ptr) ptr = new type(arg1,arg2); \
117#ifndef TTHREAD_TLS_DECL
119#define TTHREAD_TLS_DECL(type, name) \
120 TTHREAD_TLS_DECL_IMPL(type,name,_R__JOIN_(ptr,__LINE__),)
122#define TTHREAD_TLS_DECL_ARG(type, name, arg) \
123 TTHREAD_TLS_DECL_IMPL(type,name,_R__JOIN_(ptr,__LINE__),arg)
125#define TTHREAD_TLS_DECL_ARG2(type, name, arg1, arg2) \
126 TTHREAD_TLS_DECL_IMPL2(type,name,_R__JOIN_(ptr,__LINE__),arg1,arg2)
130template <
int marker,
typename T>
141template <
int marker,
typename Array,
typename T>
152template <
int marker,
typename T,
typename ArgType>
169#if defined(R__HAS___THREAD)
171# define TTHREAD_TLS_DECLARE(type,name)
172# define TTHREAD_TLS_INIT(type,name,value) static __thread type name = (value)
173# define TTHREAD_TLS_SET(type,name,value) name = (value)
174# define TTHREAD_TLS_GET(type,name) (name)
175# define TTHREAD_TLS_FREE(name)
177#elif defined(R__HAS_DECLSPEC_THREAD)
179# define TTHREAD_TLS_DECLARE(type,name)
180# define TTHREAD_TLS_INIT(type,name,value) static __declspec(thread) type name = (value)
181# define TTHREAD_TLS_SET(type,name,value) name = (value)
182# define TTHREAD_TLS_GET(type,name) (name)
183# define TTHREAD_TLS_FREE(name)
185#elif defined(R__HAS_PTHREAD)
193# define TTHREAD_TLS_DECLARE(type,name) \
194 static pthread_key_t _##name##_key; \
195 static void _##name##_key_delete(void * arg) \
197 assert (NULL != arg); \
200 static void _##name##_key_create(void) \
203 _ret = pthread_key_create(&(_##name##_key), _##name##_key_delete); \
205 assert (0 == _ret); \
207 static pthread_once_t _##name##_once = PTHREAD_ONCE_INIT;
209# define TTHREAD_TLS_INIT(type,name,value) \
212 (void) pthread_once(&(_##name##_once), _##name##_key_create); \
213 if ((_ptr = pthread_getspecific(_##name##_key)) == NULL) { \
214 _ptr = malloc(sizeof(type)); \
215 assert (NULL != _ptr); \
216 (void) pthread_setspecific(_##name##_key, _ptr); \
217 *((type*)_ptr) = (value); \
221# define TTHREAD_TLS_SET(type,name,value) \
223 void *_ptr = pthread_getspecific(_##name##_key); \
224 assert (NULL != _ptr); \
225 *((type*)_ptr) = (value); \
228# define TTHREAD_TLS_GET(type,name) \
229 *((type*)pthread_getspecific(_##name##_key))
231# define TTHREAD_TLS_FREE(name) \
232 pthread_key_delete(_##name##_key);
236#error "No Thread Local Storage (TLS) technology for this platform specified."
Basic types used by ROOT and required by TInterpreter.
bool Bool_t
Boolean (0=false, 1=true) (bool)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.