Loki/include/loki/ThreadLocal.h

80 lines
3.5 KiB
C
Raw Normal View History

////////////////////////////////////////////////////////////////////////////////
// The Loki Library
// Copyright (c) 2009 by Rich Sposato
// Permission to use, copy, modify, distribute and sell this software for any
// purpose is hereby granted without fee, provided that the above copyright
// notice appear in all copies and that both that copyright notice and this
// permission notice appear in supporting documentation.
// The author makes no representations about the
// suitability of this software for any purpose. It is provided "as is"
// without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////
#ifndef LOKI_THREAD_LOCAL_H_INCLUDED
#define LOKI_THREAD_LOCAL_H_INCLUDED
// $Id$
// ----------------------------------------------------------------------------
// First assume the compiler does allow thread-local storage by #defining the
// macro which allows compiler to see the code inside this file.
// Then #undef the macro for compilers which do not support thread-local
// storage or do not implement it correctly.
#define LOKI_THINKS_COMPILER_ALLOWS_THREAD_LOCAL_STORAGE 1
#if defined( __GNUC__ )
// The __APPLE__ macro does not refer to a compiler, but to the Apple OSX operating system.
#if defined( __APPLE__ )
#warning "GCC for Apple does not allow thread_local storage, so you can not use some parts of Loki."
#undef COMPILER_ALLOWS_THREAD_LOCAL_STORAGE
#elif defined( __CYGWIN__ )
#if ( __GNUC__ <= 3 )
#warning "Older versions of GCC for Cygwin do not allow thread_local storage, so you can not use some parts of Loki."
#undef COMPILER_ALLOWS_THREAD_LOCAL_STORAGE
#endif
#elif ( __GNUC__ == 4 ) // GNU versions other than Cygwin.
#if ( __GNUC_MINOR__ == 4 )
#warning "GCC version 4.4 implements thread_local storage incorrectly, so you can not use some parts of Loki."
#undef COMPILER_ALLOWS_THREAD_LOCAL_STORAGE
#endif
#endif
#endif
#if defined( LOKI_THINKS_COMPILER_ALLOWS_THREAD_LOCAL_STORAGE ) && !defined( LOKI_THREAD_LOCAL )
/** @par thread_local Keyword
Some parts of Loki require compilers to provide thread local storage - meaning
each thread gets its own copy of the data. The next version of C++ will have
a new keyword, thread_local for that purpose. Some existing compilers already
provide thread local storage using different syntax, so these lines use
thread_local to mimic that syntax. If your compiler provides thread local
storage but using different syntax besides "thread_local", you may want to
modify these lines. If your compiler does not support thread local storage,
you can't use some parts of Loki.
*/
#if defined( _MSC_VER )
#if ( _MSC_VER >= 1300 )
#define LOKI_THREAD_LOCAL __declspec( thread )
#else
#error "Only Visual Studio versions 7.0 and after supported."
#endif
#elif ( __GNUC__ )
#define LOKI_THREAD_LOCAL __thread
#else
#warning "Check if your compiler provides thread local storage."
#warning "Run ThreadLocal test project to see if the compiler implements thread_local correctly."
#define LOKI_THREAD_LOCAL thread_local
#endif
#endif // if compiler allows thread_local storage and LOKI_THREAD_LOCAL macro not defined yet
// ----------------------------------------------------------------------------
#endif // end file guardian