diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2022-09-21 20:17:38 +0300 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2022-09-21 20:17:38 +0300 |
commit | e6c9b17192c56494adba359d5e132c431b241191 (patch) | |
tree | 6f2449871a118a0e8919ce842b1174e06cb470ef /contrib/restricted/boost/libs/context/src/execution_context.cpp | |
parent | 285021ab1aac39e84b269d9bacd4deee69cf63fc (diff) | |
download | ydb-e6c9b17192c56494adba359d5e132c431b241191.tar.gz |
Ydb stable 22-4-2122.4.21
x-stable-origin-commit: e89099581237299a132feafb5b58af59ebd0468a
Diffstat (limited to 'contrib/restricted/boost/libs/context/src/execution_context.cpp')
-rw-r--r-- | contrib/restricted/boost/libs/context/src/execution_context.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/contrib/restricted/boost/libs/context/src/execution_context.cpp b/contrib/restricted/boost/libs/context/src/execution_context.cpp new file mode 100644 index 0000000000..fc593ecb03 --- /dev/null +++ b/contrib/restricted/boost/libs/context/src/execution_context.cpp @@ -0,0 +1,69 @@ + +// Copyright Oliver Kowalke 2009. +// 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) + +#include "boost/context/detail/config.hpp" + +#if ! defined(BOOST_CONTEXT_NO_CXX11) + +#include "boost/context/execution_context.hpp" +#include <boost/config.hpp> + +#ifdef BOOST_HAS_ABI_HEADERS +# include BOOST_ABI_PREFIX +#endif + +namespace boost { +namespace context { + +#if !defined(BOOST_NO_CXX11_THREAD_LOCAL) + +namespace detail { + +ecv1_activation_record::ptr_t & +ecv1_activation_record::current() noexcept { + thread_local static ptr_t current; + return current; +} + +// zero-initialization +thread_local static std::size_t counter; + +// schwarz counter +ecv1_activation_record_initializer::ecv1_activation_record_initializer() noexcept { + if ( 0 == counter++) { + ecv1_activation_record::current().reset( new ecv1_activation_record() ); + } +} + +ecv1_activation_record_initializer::~ecv1_activation_record_initializer() { + if ( 0 == --counter) { + BOOST_ASSERT( ecv1_activation_record::current()->is_main_context() ); + delete ecv1_activation_record::current().detach(); + } +} + +} + +namespace v1 { + +execution_context +execution_context::current() noexcept { + // initialized the first time control passes; per thread + thread_local static detail::ecv1_activation_record_initializer initializer; + return execution_context(); +} + +} + +#endif + +}} + +#ifdef BOOST_HAS_ABI_HEADERS +# include BOOST_ABI_SUFFIX +#endif + +#endif |