diff options
Diffstat (limited to 'boost/compute/detail/global_static.hpp')
-rw-r--r-- | boost/compute/detail/global_static.hpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/boost/compute/detail/global_static.hpp b/boost/compute/detail/global_static.hpp new file mode 100644 index 0000000000..d8014e4252 --- /dev/null +++ b/boost/compute/detail/global_static.hpp @@ -0,0 +1,37 @@ +//---------------------------------------------------------------------------// +// 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 |