38 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //---------------------------------------------------------------------------//
 | |
| // Copyright (c) 2013-2014 Kyle Lutz <kyle.r.lutz@gmail.com>
 | |
| //
 | |
| // Distributed under the Boost Software License, Version 1.0
 | |
| // See accompanying file LICENSE_1_0.txt or copy at
 | |
| // http://www.boost.org/LICENSE_1_0.txt
 | |
| //
 | |
| // See http://boostorg.github.com/compute for more information.
 | |
| //---------------------------------------------------------------------------//
 | |
| 
 | |
| #ifndef BOOST_COMPUTE_DETAIL_GLOBAL_STATIC_HPP
 | |
| #define BOOST_COMPUTE_DETAIL_GLOBAL_STATIC_HPP
 | |
| 
 | |
| #include <boost/compute/config.hpp>
 | |
| 
 | |
| #ifdef BOOST_COMPUTE_THREAD_SAFE
 | |
| #  ifdef BOOST_COMPUTE_HAVE_THREAD_LOCAL
 | |
|      // use c++11 thread local storage
 | |
| #    define BOOST_COMPUTE_DETAIL_GLOBAL_STATIC(type, name, ctor) \
 | |
|        thread_local type name ctor;
 | |
| #  else
 | |
|       // use thread_specific_ptr from boost.thread
 | |
| #     include <boost/thread/tss.hpp>
 | |
| #     define BOOST_COMPUTE_DETAIL_GLOBAL_STATIC(type, name, ctor) \
 | |
|         static ::boost::thread_specific_ptr< type > BOOST_PP_CAT(name, _tls_ptr_); \
 | |
|         if(!BOOST_PP_CAT(name, _tls_ptr_).get()){ \
 | |
|             BOOST_PP_CAT(name, _tls_ptr_).reset(new type ctor); \
 | |
|         } \
 | |
|         static type &name = *BOOST_PP_CAT(name, _tls_ptr_);
 | |
| #  endif
 | |
| #else
 | |
|    // no thread-safety, just use static
 | |
| #  define BOOST_COMPUTE_DETAIL_GLOBAL_STATIC(type, name, ctor) \
 | |
|      static type name ctor;
 | |
| #endif
 | |
| 
 | |
| #endif // BOOST_COMPUTE_DETAIL_GLOBAL_STATIC_HPP
 | 
