#ifndef BOOST_LEAF_CONFIG_TLS_GLOBALS_HPP_INCLUDED #define BOOST_LEAF_CONFIG_TLS_GLOBALS_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 globals, which is suitable for single thread environments. #include namespace boost { namespace leaf { namespace leaf_detail { using atomic_unsigned_int = unsigned int; } namespace tls { template struct BOOST_LEAF_SYMBOL_VISIBLE ptr { static T * p; }; template 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 std::uint32_t x; }; template 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