2 // Copyright Oliver Kowalke 2009.
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
7 #include "boost/context/detail/config.hpp"
9 #if ! defined(BOOST_CONTEXT_NO_CXX11)
11 #include "boost/context/execution_context.hpp"
12 #include <boost/config.hpp>
14 #ifdef BOOST_HAS_ABI_HEADERS
15 # include BOOST_ABI_PREFIX
21 #if !defined(BOOST_NO_CXX11_THREAD_LOCAL)
25 ecv1_activation_record::ptr_t &
26 ecv1_activation_record::current() noexcept {
27 thread_local static ptr_t current;
31 // zero-initialization
32 thread_local static std::size_t counter;
35 ecv1_activation_record_initializer::ecv1_activation_record_initializer() noexcept {
36 if ( 0 == counter++) {
37 ecv1_activation_record::current().reset( new ecv1_activation_record() );
41 ecv1_activation_record_initializer::~ecv1_activation_record_initializer() {
42 if ( 0 == --counter) {
43 BOOST_ASSERT( ecv1_activation_record::current()->is_main_context() );
44 delete ecv1_activation_record::current().detach();
53 execution_context::current() noexcept {
54 // initialized the first time control passes; per thread
55 thread_local static detail::ecv1_activation_record_initializer initializer;
56 return execution_context();
65 #ifdef BOOST_HAS_ABI_HEADERS
66 # include BOOST_ABI_SUFFIX