X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Fos_thread.hpp;h=6c0b488c0152474a031a82839b0c767777714fdd;hb=5b9a463db890e86b95c7ac37484704759eabc641;hp=72195b6c2aecbae33517904b75845fc9e1cdc10d;hpb=743d6c75f3edfb728f689027347d2de9b0068425;p=apitrace diff --git a/common/os_thread.hpp b/common/os_thread.hpp index 72195b6..6c0b488 100644 --- a/common/os_thread.hpp +++ b/common/os_thread.hpp @@ -39,6 +39,24 @@ #include #endif + +/** + * Compiler TLS. + * + * See also: + * - http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Thread_002dLocal.html + * - http://msdn.microsoft.com/en-us/library/9w1sdazb.aspx + */ +#if defined(_MSC_VER) +# define thread_specific __declspec(thread) +#elif defined(__GNUC__) +# define thread_specific __thread +#else +# define thread_specific +# error "Unsupported compiler" +#endif + + namespace os { @@ -289,14 +307,25 @@ namespace os { void reset(T* new_value=0) { T * old_value = get(); + set(new_value); + if (old_value) { + delete old_value; + } + } + + T* release (void) { + T * old_value = get(); + set(0); + return old_value; + } + +private: + void set(T* new_value) { #ifdef _WIN32 TlsSetValue(dwTlsIndex, new_value); #else pthread_setspecific(key, new_value); #endif - if (old_value) { - delete old_value; - } } }; @@ -313,7 +342,7 @@ namespace os { #endif template< class Function, class Arg > - explicit thread( Function& f, Arg & arg ) { + explicit thread( Function& f, Arg arg ) { #ifdef _WIN32 /* FIXME */ DWORD id = 0;