#ifndef BOOST_LEAF_CONFIG_TLS_CPP11_HPP_INCLUDED #define BOOST_LEAF_CONFIG_TLS_CPP11_HPP_INCLUDED // Copyright 2018-2022 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 uint32_t // values using the C++11 built-in thread_local storage class specifier. #include #include namespace boost { namespace leaf { namespace leaf_detail { using atomic_unsigned_int = std::atomic; } namespace tls { template struct BOOST_LEAF_SYMBOL_VISIBLE ptr { static thread_local T * p; }; template thread_local T * ptr::p; template T * read_ptr() noexcept { return ptr::p; } template void write_ptr( T * p ) noexcept { ptr::p = p; } //////////////////////////////////////// template struct BOOST_LEAF_SYMBOL_VISIBLE tagged_uint32 { static thread_local std::uint32_t x; }; template thread_local std::uint32_t tagged_uint32::x; template std::uint32_t read_uint32() noexcept { return tagged_uint32::x; } template void write_uint32( std::uint32_t x ) noexcept { tagged_uint32::x = x; } template void uint32_increment() noexcept { ++tagged_uint32::x; } template void uint32_decrement() noexcept { --tagged_uint32::x; } } } } #endif