12345678910111213141516171819202122232425262728293031323334353637 |
- //---------------------------------------------------------------------------//
- // 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
|