12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #ifndef BOOST_LEAF_CONFIG_TLS_CPP11_HPP_INCLUDED
- #define BOOST_LEAF_CONFIG_TLS_CPP11_HPP_INCLUDED
- // Copyright 2018-2023 Emil Dotchevski and Reverge Studios, Inc.
- // 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)
- // LEAF requires thread local storage support for pointers and for uin32_t values.
- // This header implements thread local storage for pointers and for unsigned int
- // values using the C++11 built-in thread_local storage class specifier.
- #include <cstdint>
- #include <atomic>
- namespace boost { namespace leaf {
- namespace leaf_detail
- {
- using atomic_unsigned_int = std::atomic<unsigned int>;
- }
- namespace tls
- {
- template <class T>
- struct BOOST_LEAF_SYMBOL_VISIBLE ptr
- {
- static thread_local T * p;
- };
- template <class T>
- thread_local T * ptr<T>::p;
- template <class T>
- T * read_ptr() noexcept
- {
- return ptr<T>::p;
- }
- template <class T>
- void write_ptr( T * p ) noexcept
- {
- ptr<T>::p = p;
- }
- ////////////////////////////////////////
- template <class Tag>
- struct BOOST_LEAF_SYMBOL_VISIBLE tagged_uint
- {
- static thread_local unsigned x;
- };
- template <class Tag>
- thread_local unsigned tagged_uint<Tag>::x;
- template <class Tag>
- unsigned read_uint() noexcept
- {
- return tagged_uint<Tag>::x;
- }
- template <class Tag>
- void write_uint( unsigned x ) noexcept
- {
- tagged_uint<Tag>::x = x;
- }
- template <class Tag>
- void uint_increment() noexcept
- {
- ++tagged_uint<Tag>::x;
- }
- template <class Tag>
- void uint_decrement() noexcept
- {
- --tagged_uint<Tag>::x;
- }
- }
- } }
- #endif
|