aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrobot-contrib <robot-contrib@yandex-team.com>2022-09-19 02:02:28 +0300
committerrobot-contrib <robot-contrib@yandex-team.com>2022-09-19 02:02:28 +0300
commitc38426f392c5dd64ecd466d34bfd73a2a3cbce7a (patch)
tree43f7960065a166ecdafdeb226727cafd549f575e
parent4600a627523fd1cce0c863ad74c0553c5f032fe0 (diff)
downloadydb-c38426f392c5dd64ecd466d34bfd73a2a3cbce7a.tar.gz
Update contrib/restricted/boost/context to 1.80.0
-rw-r--r--contrib/restricted/boost/CMakeLists.txt1
-rw-r--r--contrib/restricted/boost/context/README.md10
-rw-r--r--contrib/restricted/boost/context/impl_common/CMakeLists.txt2
-rw-r--r--contrib/restricted/boost/context/include/boost/context/continuation_ucontext.hpp50
-rw-r--r--contrib/restricted/boost/context/include/boost/context/continuation_winfib.hpp48
-rw-r--r--contrib/restricted/boost/context/include/boost/context/detail/apply.hpp74
-rw-r--r--contrib/restricted/boost/context/include/boost/context/detail/config.hpp18
-rw-r--r--contrib/restricted/boost/context/include/boost/context/detail/exception.hpp38
-rw-r--r--contrib/restricted/boost/context/include/boost/context/detail/index_sequence.hpp72
-rw-r--r--contrib/restricted/boost/context/include/boost/context/detail/tuple.hpp129
-rw-r--r--contrib/restricted/boost/context/include/boost/context/execution_context.hpp12
-rw-r--r--contrib/restricted/boost/context/include/boost/context/execution_context_v1.hpp493
-rw-r--r--contrib/restricted/boost/context/include/boost/context/execution_context_v2.hpp499
-rw-r--r--contrib/restricted/boost/context/include/boost/context/execution_context_v2_void.ipp327
-rw-r--r--contrib/restricted/boost/context/include/boost/context/fiber_ucontext.hpp91
-rw-r--r--contrib/restricted/boost/context/include/boost/context/fiber_winfib.hpp53
-rw-r--r--contrib/restricted/boost/context/include/boost/context/fixedsize_stack.hpp17
-rw-r--r--contrib/restricted/boost/context/include/boost/context/stack_context.hpp4
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_elf_gas.S20
-rw-r--r--contrib/restricted/boost/context/src/asm/make_x86_64_sysv_elf_gas.S12
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_elf_gas.S22
-rw-r--r--contrib/restricted/boost/context/src/continuation.cpp2
-rw-r--r--contrib/restricted/boost/context/src/execution_context.cpp69
-rw-r--r--contrib/restricted/boost/context/src/fiber.cpp10
-rw-r--r--contrib/restricted/boost/context/src/posix/stack_traits.cpp47
-rw-r--r--contrib/restricted/boost/mp11/CMakeLists.txt18
26 files changed, 282 insertions, 1856 deletions
diff --git a/contrib/restricted/boost/CMakeLists.txt b/contrib/restricted/boost/CMakeLists.txt
index e078b9740e..7763b2dba1 100644
--- a/contrib/restricted/boost/CMakeLists.txt
+++ b/contrib/restricted/boost/CMakeLists.txt
@@ -52,6 +52,7 @@ add_subdirectory(locale)
add_subdirectory(logic)
add_subdirectory(math)
add_subdirectory(move)
+add_subdirectory(mp11)
add_subdirectory(mpl)
add_subdirectory(multi_array)
add_subdirectory(multi_index)
diff --git a/contrib/restricted/boost/context/README.md b/contrib/restricted/boost/context/README.md
index 5149b498b9..44aeff04f3 100644
--- a/contrib/restricted/boost/context/README.md
+++ b/contrib/restricted/boost/context/README.md
@@ -8,14 +8,14 @@ instance represents a specific point in the application's execution path. This i
higher-level abstractions, like coroutines, cooperative threads (userland threads) or an equivalent to
C# keyword yield in C++.
-A execution_context provides the means to suspend the current execution path and to transfer execution control,
-thereby permitting another execution_context to run on the current thread. This state full transfer mechanism
-enables a execution_context to suspend execution from within nested functions and, later, to resume from where it
-was suspended. While the execution path represented by a execution_context only runs on a single thread, it can be
+A fiber provides the means to suspend the current execution path and to transfer execution control,
+thereby permitting another fiber to run on the current thread. This state full transfer mechanism
+enables a fiber to suspend execution from within nested functions and, later, to resume from where it
+was suspended. While the execution path represented by a fiber only runs on a single thread, it can be
migrated to another thread at any given time.
A context switch between threads requires system calls (involving the OS kernel), which can cost more than
-thousand CPU cycles on x86 CPUs. By contrast, transferring control among them requires only fewer than
+thousand CPU cycles on x86 CPUs. By contrast, transferring control among fibers requires only fewer than
hundred CPU cycles because it does not involve system calls as it is done within a single thread.
boost.context requires C++11!
diff --git a/contrib/restricted/boost/context/impl_common/CMakeLists.txt b/contrib/restricted/boost/context/impl_common/CMakeLists.txt
index e2e79916bf..0b374b73b4 100644
--- a/contrib/restricted/boost/context/impl_common/CMakeLists.txt
+++ b/contrib/restricted/boost/context/impl_common/CMakeLists.txt
@@ -19,12 +19,12 @@ target_link_libraries(boost-context-impl_common PUBLIC
contrib-libs-cxxsupp
restricted-boost-assert
restricted-boost-config
+ restricted-boost-mp11
restricted-boost-pool
restricted-boost-predef
restricted-boost-smart_ptr
restricted-boost-thread
)
target_sources(boost-context-impl_common PRIVATE
- ${CMAKE_SOURCE_DIR}/contrib/restricted/boost/context/src/execution_context.cpp
${CMAKE_SOURCE_DIR}/contrib/restricted/boost/context/src/posix/stack_traits.cpp
)
diff --git a/contrib/restricted/boost/context/include/boost/context/continuation_ucontext.hpp b/contrib/restricted/boost/context/include/boost/context/continuation_ucontext.hpp
index b2682cf47f..951e542983 100644
--- a/contrib/restricted/boost/context/include/boost/context/continuation_ucontext.hpp
+++ b/contrib/restricted/boost/context/include/boost/context/continuation_ucontext.hpp
@@ -209,7 +209,7 @@ struct BOOST_CONTEXT_DECL activation_record_initializer {
};
struct forced_unwind {
- activation_record * from{ nullptr };
+ activation_record * from{ nullptr };
forced_unwind( activation_record * from_) noexcept :
from{ from_ } {
@@ -287,6 +287,8 @@ static activation_record * create_context1( StackAlloc && salloc, Fn && fn) {
reinterpret_cast< uintptr_t >( sctx.sp) - static_cast< uintptr_t >( sctx.size) );
// create user-context
if ( BOOST_UNLIKELY( 0 != ::getcontext( & record->uctx) ) ) {
+ record->~capture_t();
+ salloc.deallocate( sctx);
throw std::system_error(
std::error_code( errno, std::system_category() ),
"getcontext() failed");
@@ -320,6 +322,8 @@ static activation_record * create_context2( preallocated palloc, StackAlloc && s
reinterpret_cast< uintptr_t >( palloc.sctx.sp) - static_cast< uintptr_t >( palloc.sctx.size) );
// create user-context
if ( BOOST_UNLIKELY( 0 != ::getcontext( & record->uctx) ) ) {
+ record->~capture_t();
+ salloc.deallocate( palloc.sctx);
throw std::system_error(
std::error_code( errno, std::system_category() ),
"getcontext() failed");
@@ -445,30 +449,12 @@ public:
return nullptr == ptr_ || ptr_->terminated;
}
- bool operator==( continuation const& other) const noexcept {
- return ptr_ == other.ptr_;
- }
-
- bool operator!=( continuation const& other) const noexcept {
- return ptr_ != other.ptr_;
- }
-
bool operator<( continuation const& other) const noexcept {
return ptr_ < other.ptr_;
}
- bool operator>( continuation const& other) const noexcept {
- return other.ptr_ < ptr_;
- }
-
- bool operator<=( continuation const& other) const noexcept {
- return ! ( * this > other);
- }
-
- bool operator>=( continuation const& other) const noexcept {
- return ! ( * this < other);
- }
-
+ #if !defined(BOOST_EMBTC)
+
template< typename charT, class traitsT >
friend std::basic_ostream< charT, traitsT > &
operator<<( std::basic_ostream< charT, traitsT > & os, continuation const& other) {
@@ -479,11 +465,33 @@ public:
}
}
+ #else
+
+ template< typename charT, class traitsT >
+ friend std::basic_ostream< charT, traitsT > &
+ operator<<( std::basic_ostream< charT, traitsT > & os, continuation const& other);
+
+ #endif
+
void swap( continuation & other) noexcept {
std::swap( ptr_, other.ptr_);
}
};
+#if defined(BOOST_EMBTC)
+
+ template< typename charT, class traitsT >
+ inline std::basic_ostream< charT, traitsT > &
+ operator<<( std::basic_ostream< charT, traitsT > & os, continuation const& other) {
+ if ( nullptr != other.ptr_) {
+ return os << other.ptr_;
+ } else {
+ return os << "{not-a-context}";
+ }
+ }
+
+#endif
+
template<
typename Fn,
typename = detail::disable_overload< continuation, Fn >
diff --git a/contrib/restricted/boost/context/include/boost/context/continuation_winfib.hpp b/contrib/restricted/boost/context/include/boost/context/continuation_winfib.hpp
index a92463f326..856c868469 100644
--- a/contrib/restricted/boost/context/include/boost/context/continuation_winfib.hpp
+++ b/contrib/restricted/boost/context/include/boost/context/continuation_winfib.hpp
@@ -185,7 +185,7 @@ struct BOOST_CONTEXT_DECL activation_record_initializer {
};
struct forced_unwind {
- activation_record * from{ nullptr };
+ activation_record * from{ nullptr };
explicit forced_unwind( activation_record * from_) :
from{ from_ } {
@@ -384,30 +384,12 @@ public:
return nullptr == ptr_ || ptr_->terminated;
}
- bool operator==( continuation const& other) const noexcept {
- return ptr_ == other.ptr_;
- }
-
- bool operator!=( continuation const& other) const noexcept {
- return ptr_ != other.ptr_;
- }
-
bool operator<( continuation const& other) const noexcept {
return ptr_ < other.ptr_;
}
-
- bool operator>( continuation const& other) const noexcept {
- return other.ptr_ < ptr_;
- }
-
- bool operator<=( continuation const& other) const noexcept {
- return ! ( * this > other);
- }
-
- bool operator>=( continuation const& other) const noexcept {
- return ! ( * this < other);
- }
-
+
+ #if !defined(BOOST_EMBTC)
+
template< typename charT, class traitsT >
friend std::basic_ostream< charT, traitsT > &
operator<<( std::basic_ostream< charT, traitsT > & os, continuation const& other) {
@@ -418,11 +400,33 @@ public:
}
}
+ #else
+
+ template< typename charT, class traitsT >
+ friend std::basic_ostream< charT, traitsT > &
+ operator<<( std::basic_ostream< charT, traitsT > & os, continuation const& other);
+
+ #endif
+
void swap( continuation & other) noexcept {
std::swap( ptr_, other.ptr_);
}
};
+#if defined(BOOST_EMBTC)
+
+ template< typename charT, class traitsT >
+ inline std::basic_ostream< charT, traitsT > &
+ operator<<( std::basic_ostream< charT, traitsT > & os, continuation const& other) {
+ if ( nullptr != other.ptr_) {
+ return os << other.ptr_;
+ } else {
+ return os << "{not-a-context}";
+ }
+ }
+
+#endif
+
template<
typename Fn,
typename = detail::disable_overload< continuation, Fn >
diff --git a/contrib/restricted/boost/context/include/boost/context/detail/apply.hpp b/contrib/restricted/boost/context/include/boost/context/detail/apply.hpp
deleted file mode 100644
index fbf0ca6176..0000000000
--- a/contrib/restricted/boost/context/include/boost/context/detail/apply.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-
-// Copyright Oliver Kowalke 2014.
-// 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)
-
-#ifndef BOOST_CONTEXT_DETAIL_APPLY_H
-#define BOOST_CONTEXT_DETAIL_APPLY_H
-
-#include <functional>
-#include <tuple>
-#include <type_traits>
-#include <utility>
-
-#include <boost/config.hpp>
-
-#include <boost/context/detail/config.hpp>
-#if defined(BOOST_NO_CXX17_STD_INVOKE)
-#include <boost/context/detail/invoke.hpp>
-#endif
-#include <boost/context/detail/index_sequence.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-
-#if defined(BOOST_MSVC)
-# pragma warning(push)
-# pragma warning(disable: 4100)
-#endif
-
-namespace boost {
-namespace context {
-namespace detail {
-
-template< typename Fn, typename Tpl, std::size_t ... I >
-auto
-apply_impl( Fn && fn, Tpl && tpl, index_sequence< I ... >)
-#if defined(BOOST_NO_CXX17_STD_INVOKE)
- -> decltype( boost::context::detail::invoke( std::forward< Fn >( fn), std::get< I >( std::forward< Tpl >( tpl) ) ... ) )
-#else
- -> decltype( std::invoke( std::forward< Fn >( fn), std::get< I >( std::forward< Tpl >( tpl) ) ... ) )
-#endif
-{
-#if defined(BOOST_NO_CXX17_STD_INVOKE)
- return boost::context::detail::invoke( std::forward< Fn >( fn), std::get< I >( std::forward< Tpl >( tpl) ) ... );
-#else
- return std::invoke( std::forward< Fn >( fn), std::get< I >( std::forward< Tpl >( tpl) ) ... );
-#endif
-}
-
-template< typename Fn, typename Tpl >
-auto
-apply( Fn && fn, Tpl && tpl)
- -> decltype( apply_impl( std::forward< Fn >( fn),
- std::forward< Tpl >( tpl),
- make_index_sequence< std::tuple_size< typename std::decay< Tpl >::type >::value >{}) )
-{
- return apply_impl( std::forward< Fn >( fn),
- std::forward< Tpl >( tpl),
- make_index_sequence< std::tuple_size< typename std::decay< Tpl >::type >::value >{});
-}
-
-}}}
-
-#if defined(BOOST_MSVC)
-# pragma warning(pop)
-#endif
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_CONTEXT_DETAIL_APPLY_H
diff --git a/contrib/restricted/boost/context/include/boost/context/detail/config.hpp b/contrib/restricted/boost/context/include/boost/context/detail/config.hpp
index 15d03574b1..06737fdf99 100644
--- a/contrib/restricted/boost/context/include/boost/context/detail/config.hpp
+++ b/contrib/restricted/boost/context/include/boost/context/detail/config.hpp
@@ -30,6 +30,10 @@
# define BOOST_CONTEXT_DECL
#endif
+#if ! defined(BOOST_USE_UCONTEXT) && defined(__CYGWIN__)
+# define BOOST_USE_UCONTEXT
+#endif
+
#if ! defined(BOOST_CONTEXT_SOURCE) && ! defined(BOOST_ALL_NO_LIB) && ! defined(BOOST_CONTEXT_NO_LIB)
# define BOOST_LIB_NAME boost_context
# if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_CONTEXT_DYN_LINK)
@@ -115,4 +119,18 @@ static constexpr std::size_t cacheline_length{ 64 };
static constexpr std::size_t prefetch_stride{ 4 * cacheline_length };
#endif
+#if defined(__GLIBCPP__) || defined(__GLIBCXX__)
+// GNU libstdc++ 3
+# define BOOST_CONTEXT_HAS_CXXABI_H
+#endif
+
+#if defined( BOOST_CONTEXT_HAS_CXXABI_H )
+# include <cxxabi.h>
+#endif
+
+#if defined(__OpenBSD__)
+// stacks need mmap(2) with MAP_STACK
+# define BOOST_CONTEXT_USE_MAP_STACK
+#endif
+
#endif // BOOST_CONTEXT_DETAIL_CONFIG_H
diff --git a/contrib/restricted/boost/context/include/boost/context/detail/exception.hpp b/contrib/restricted/boost/context/include/boost/context/detail/exception.hpp
deleted file mode 100644
index 14b4ab5217..0000000000
--- a/contrib/restricted/boost/context/include/boost/context/detail/exception.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-
-// Copyright Oliver Kowalke 2014.
-// 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)
-
-#ifndef BOOST_CONTEXT_DETAIL_EXCEPTION_H
-#define BOOST_CONTEXT_DETAIL_EXCEPTION_H
-
-#include <boost/config.hpp>
-
-#include <boost/context/detail/fcontext.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace context {
-namespace detail {
-
-struct forced_unwind {
- fcontext_t fctx{ nullptr };
-
- forced_unwind() = default;
-
- forced_unwind( fcontext_t fctx_) :
- fctx( fctx_) {
- }
-};
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_CONTEXT_DETAIL_EXCEPTION_H
diff --git a/contrib/restricted/boost/context/include/boost/context/detail/index_sequence.hpp b/contrib/restricted/boost/context/include/boost/context/detail/index_sequence.hpp
deleted file mode 100644
index 2d484ba062..0000000000
--- a/contrib/restricted/boost/context/include/boost/context/detail/index_sequence.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-
-// Copyright Oliver Kowalke 2014.
-// 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)
-
-#ifndef BOOST_CONTEXT_DETAIL_INDEX_SEQUENCE_H
-#define BOOST_CONTEXT_DETAIL_INDEX_SEQUENCE_H
-
-#include <cstddef>
-
-#include <boost/config.hpp>
-
-#include <boost/context/detail/config.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace context {
-namespace detail {
-
-#if ! defined(BOOST_CONTEXT_NO_CXX14_INTEGER_SEQUENCE)
-template< std::size_t ... I >
-using index_sequence = std::index_sequence< I ... >;
-template< std::size_t I >
-using make_index_sequence = std::make_index_sequence< I >;
-template< typename ... T >
-using index_sequence_for = std::index_sequence_for< T ... >;
-#else
-//http://stackoverflow.com/questions/17424477/implementation-c14-make-integer-sequence
-
-template< std::size_t ... I >
-struct index_sequence {
- using type = index_sequence;
- using value_type = std::size_t;
- static constexpr std::size_t size() {
- return sizeof ... (I);
- }
-};
-
-template< typename Seq1, typename Seq2 >
-struct concat_sequence;
-
-template< std::size_t ... I1, std::size_t ... I2 >
-struct concat_sequence< index_sequence< I1 ... >, index_sequence< I2 ... > > : public index_sequence< I1 ..., (sizeof ... (I1)+I2) ... > {
-};
-
-template< std::size_t I >
-struct make_index_sequence : public concat_sequence< typename make_index_sequence< I/2 >::type,
- typename make_index_sequence< I-I/2 >::type > {
-};
-
-template<>
-struct make_index_sequence< 0 > : public index_sequence<> {
-};
-template<>
-struct make_index_sequence< 1 > : public index_sequence< 0 > {
-};
-
-template< typename ... T >
-using index_sequence_for = make_index_sequence< sizeof ... (T) >;
-#endif
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_CONTEXT_DETAIL_INDEX_SEQUENCE_H
diff --git a/contrib/restricted/boost/context/include/boost/context/detail/tuple.hpp b/contrib/restricted/boost/context/include/boost/context/detail/tuple.hpp
deleted file mode 100644
index e1b2f867a7..0000000000
--- a/contrib/restricted/boost/context/include/boost/context/detail/tuple.hpp
+++ /dev/null
@@ -1,129 +0,0 @@
-
-// Copyright Oliver Kowalke 2014.
-// 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)
-
-#ifndef BOOST_CONTEXT_DETAIL_TUPLE_H
-#define BOOST_CONTEXT_DETAIL_TUPLE_H
-
-#include <tuple>
-#include <utility>
-
-#include <boost/config.hpp>
-
-#include <boost/context/detail/config.hpp>
-#include <boost/context/detail/index_sequence.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace context {
-namespace detail {
-
-template< typename ... S, typename ... T, std::size_t ... I >
-void
-head_impl( std::tuple< S ... > & s,
- std::tuple< T ... > & t, index_sequence< I ... >) {
- t = std::tuple< T ... >{ std::get< I >( s) ... };
-}
-
-template< typename ... S, typename ... T, std::size_t ... I >
-void
-head_impl( std::tuple< S ... > && s,
- std::tuple< T ... > & t, index_sequence< I ... >) {
- t = std::tuple< T ... >{ std::get< I >( std::move( s) ) ... };
-}
-
-template< typename ... S, std::size_t ... I1, typename ... T, std::size_t ... I2 >
-void
-tail_impl( std::tuple< S ... > & s, index_sequence< I1 ... >,
- std::tuple< T ... > & t, index_sequence< I2 ... >) {
- constexpr std::size_t Idx = (sizeof...(I1)) - (sizeof...(I2));
- t = std::tuple< T ... >{ std::get< (Idx + I2) >( s) ... };
-}
-
-template< typename ... S, std::size_t ... I1, typename ... T, std::size_t ... I2 >
-void
-tail_impl( std::tuple< S ... > && s, index_sequence< I1 ... >,
- std::tuple< T ... > & t, index_sequence< I2 ... >) {
- constexpr std::size_t Idx = (sizeof...(I1)) - (sizeof...(I2));
- t = std::tuple< T ... >{ std::get< (Idx + I2) >( std::move( s) ) ... };
-}
-
-template< typename ... T >
-class tuple_head;
-
-template< typename ... T >
-class tuple_head< std::tuple< T ... > > {
-private:
- std::tuple< T ... > & t_;
-
-public:
- tuple_head( std::tuple< T ... > & t) noexcept :
- t_( t) {
- }
-
- template< typename ... S >
- void operator=( std::tuple< S ... > & s) {
- static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
- head_impl( s,
- t_, index_sequence_for< T ... >{} );
- }
- template< typename ... S >
- void operator=( std::tuple< S ... > && s) {
- static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
- head_impl( std::move( s),
- t_, index_sequence_for< T ... >{} );
- }
-};
-
-template< typename ... T >
-class tuple_tail;
-
-template< typename ... T >
-class tuple_tail< std::tuple< T ... > > {
-private:
- std::tuple< T ... > & t_;
-
-public:
- tuple_tail( std::tuple< T ... > & t) noexcept :
- t_( t) {
- }
-
- template< typename ... S >
- void operator=( std::tuple< S ... > & s) {
- static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
- tail_impl( s, index_sequence_for< S ... >{},
- t_, index_sequence_for< T ... >{} );
- }
-
- template< typename ... S >
- void operator=( std::tuple< S ... > && s) {
- static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
- tail_impl( std::move( s), index_sequence_for< S ... >{},
- t_, index_sequence_for< T ... >{} );
- }
-};
-
-template< typename ... T >
-detail::tuple_head< std::tuple< T ... > >
-head( std::tuple< T ... > & tpl) {
- return tuple_head< std::tuple< T ... > >{ tpl };
-}
-
-template< typename ... T >
-detail::tuple_tail< std::tuple< T ... > >
-tail( std::tuple< T ... > & tpl) {
- return tuple_tail< std::tuple< T ... > >{ tpl };
-}
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_CONTEXT_DETAIL_TUPLE_H
diff --git a/contrib/restricted/boost/context/include/boost/context/execution_context.hpp b/contrib/restricted/boost/context/include/boost/context/execution_context.hpp
deleted file mode 100644
index 5808e027de..0000000000
--- a/contrib/restricted/boost/context/include/boost/context/execution_context.hpp
+++ /dev/null
@@ -1,12 +0,0 @@
-
-// Copyright Oliver Kowalke 2014.
-// 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_NO_CXX11_THREAD_LOCAL)
-# include <boost/context/execution_context_v1.hpp>
-#endif
-#include <boost/context/execution_context_v2.hpp>
diff --git a/contrib/restricted/boost/context/include/boost/context/execution_context_v1.hpp b/contrib/restricted/boost/context/include/boost/context/execution_context_v1.hpp
deleted file mode 100644
index 73008e63ab..0000000000
--- a/contrib/restricted/boost/context/include/boost/context/execution_context_v1.hpp
+++ /dev/null
@@ -1,493 +0,0 @@
-
-// Copyright Oliver Kowalke 2014.
-// 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)
-
-#ifndef BOOST_CONTEXT_EXECUTION_CONTEXT_V1_H
-#define BOOST_CONTEXT_EXECUTION_CONTEXT_V1_H
-
-#include <boost/context/detail/config.hpp>
-
-#include <algorithm>
-#include <atomic>
-#include <cstddef>
-#include <cstdint>
-#include <cstdlib>
-#include <functional>
-#include <memory>
-#include <ostream>
-#include <tuple>
-#include <utility>
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/intrusive_ptr.hpp>
-
-#if defined(BOOST_NO_CXX17_STD_APPLY)
-#include <boost/context/detail/apply.hpp>
-#endif
-#include <boost/context/detail/disable_overload.hpp>
-#include <boost/context/detail/externc.hpp>
-#include <boost/context/detail/fcontext.hpp>
-#include <boost/context/fixedsize_stack.hpp>
-#include <boost/context/flags.hpp>
-#include <boost/context/preallocated.hpp>
-#include <boost/context/segmented_stack.hpp>
-#include <boost/context/stack_context.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace context {
-namespace detail {
-
-template< typename Fn >
-transfer_t ecv1_context_ontop( transfer_t);
-
-struct ecv1_activation_record;
-
-struct ecv1_data_t {
- ecv1_activation_record * from;
- void * data;
-};
-
-struct BOOST_CONTEXT_DECL ecv1_activation_record {
- typedef boost::intrusive_ptr< ecv1_activation_record > ptr_t;
-
- static ptr_t & current() noexcept;
-
- std::atomic< std::size_t > use_count{ 0 };
- fcontext_t fctx{ nullptr };
- stack_context sctx{};
- bool main_ctx{ true };
-
- // used for toplevel-context
- // (e.g. main context, thread-entry context)
- ecv1_activation_record() = default;
-
- ecv1_activation_record( fcontext_t fctx_, stack_context sctx_) noexcept :
- fctx{ fctx_ },
- sctx( sctx_ ), // sctx{ sctx_ } - clang-3.6: no viable conversion from 'boost::context::stack_context' to 'std::size_t'
- main_ctx{ false } {
- }
-
- virtual ~ecv1_activation_record() = default;
-
- bool is_main_context() const noexcept {
- return main_ctx;
- }
-
- void * resume( void * vp) {
- // store current activation record in local variable
- auto from = current().get();
- // store `this` in static, thread local pointer
- // `this` will become the active (running) context
- // returned by execution_context::current()
- current() = this;
-#if defined(BOOST_USE_SEGMENTED_STACKS)
- // adjust segmented stack properties
- __splitstack_getcontext( from->sctx.segments_ctx);
- __splitstack_setcontext( sctx.segments_ctx);
-#endif
- ecv1_data_t d = { from, vp };
- // context switch from parent context to `this`-context
- transfer_t t = jump_fcontext( fctx, & d);
- ecv1_data_t * dp = reinterpret_cast< ecv1_data_t * >( t.data);
- dp->from->fctx = t.fctx;
- // parent context resumed
- return dp->data;
- }
-
- template< typename Fn >
- void * resume_ontop( void * data, Fn && fn) {
- // store current activation record in local variable
- ecv1_activation_record * from = current().get();
- // store `this` in static, thread local pointer
- // `this` will become the active (running) context
- // returned by execution_context::current()
- current() = this;
-#if defined(BOOST_USE_SEGMENTED_STACKS)
- // adjust segmented stack properties
- __splitstack_getcontext( from->sctx.segments_ctx);
- __splitstack_setcontext( sctx.segments_ctx);
-#endif
- std::tuple< void *, Fn > p = std::forward_as_tuple( data, fn);
- ecv1_data_t d = { from, & p };
- // context switch from parent context to `this`-context
- // execute Fn( Tpl) on top of `this`
- transfer_t t = ontop_fcontext( fctx, & d, ecv1_context_ontop< Fn >);
- ecv1_data_t * dp = reinterpret_cast< ecv1_data_t * >( t.data);
- dp->from->fctx = t.fctx;
- // parent context resumed
- return dp->data;
- }
-
- virtual void deallocate() noexcept {
- }
-
- friend void intrusive_ptr_add_ref( ecv1_activation_record * ar) noexcept {
- ++ar->use_count;
- }
-
- friend void intrusive_ptr_release( ecv1_activation_record * ar) noexcept {
- BOOST_ASSERT( nullptr != ar);
- if ( 0 == --ar->use_count) {
- ar->deallocate();
- }
- }
-};
-
-struct BOOST_CONTEXT_DECL ecv1_activation_record_initializer {
- ecv1_activation_record_initializer() noexcept;
- ~ecv1_activation_record_initializer();
-};
-
-template< typename Fn >
-transfer_t ecv1_context_ontop( transfer_t t) {
- ecv1_data_t * dp = reinterpret_cast< ecv1_data_t * >( t.data);
- dp->from->fctx = t.fctx;
- auto tpl = reinterpret_cast< std::tuple< void *, Fn > * >( dp->data);
- BOOST_ASSERT( nullptr != tpl);
- auto data = std::get< 0 >( * tpl);
- typename std::decay< Fn >::type fn = std::forward< Fn >( std::get< 1 >( * tpl) );
-#if defined(BOOST_NO_CXX17_STD_APPLY)
- dp->data = boost::context::detail::apply( fn, std::tie( data) );
-#else
- dp->data = std::apply( fn, std::tie( data) );
-#endif
- return { t.fctx, dp };
-}
-
-template< typename StackAlloc, typename Fn, typename ... Args >
-class ecv1_capture_record : public ecv1_activation_record {
-private:
- typename std::decay< StackAlloc >::type salloc_;
- typename std::decay< Fn >::type fn_;
- std::tuple< typename std::decay< Args >::type ... > args_;
- ecv1_activation_record * caller_;
-
- static void destroy( ecv1_capture_record * p) noexcept {
- typename std::decay< StackAlloc >::type salloc = std::move( p->salloc_);
- stack_context sctx = p->sctx;
- // deallocate activation record
- p->~ecv1_capture_record();
- // destroy stack with stack allocator
- salloc.deallocate( sctx);
- }
-
-public:
- ecv1_capture_record( stack_context sctx, StackAlloc && salloc,
- fcontext_t fctx,
- ecv1_activation_record * caller,
- Fn && fn, Args && ... args) noexcept :
- ecv1_activation_record{ fctx, sctx },
- salloc_{ std::forward< StackAlloc >( salloc) },
- fn_( std::forward< Fn >( fn) ),
- args_( std::forward< Args >( args) ... ),
- caller_{ caller } {
- }
-
- void deallocate() noexcept override final {
- destroy( this);
- }
-
- void run() {
- auto data = caller_->resume( nullptr);
-#if defined(BOOST_NO_CXX17_STD_APPLY)
- boost::context::detail::apply( fn_, std::tuple_cat( args_, std::tie( data) ) );
-#else
- std::apply( fn_, std::tuple_cat( args_, std::tie( data) ) );
-#endif
- BOOST_ASSERT_MSG( ! main_ctx, "main-context does not execute activation-record::run()");
- }
-};
-
-}
-
-namespace v1 {
-
-class BOOST_CONTEXT_DECL execution_context {
-private:
- // tampoline function
- // entered if the execution context
- // is resumed for the first time
- template< typename AR >
- static void entry_func( detail::transfer_t t) noexcept {
- detail::ecv1_data_t * dp = reinterpret_cast< detail::ecv1_data_t * >( t.data);
- AR * ar = static_cast< AR * >( dp->data);
- BOOST_ASSERT( nullptr != ar);
- dp->from->fctx = t.fctx;
- // start execution of toplevel context-function
- ar->run();
- }
-
- typedef boost::intrusive_ptr< detail::ecv1_activation_record > ptr_t;
-
- ptr_t ptr_;
-
- template< typename StackAlloc, typename Fn, typename ... Args >
- static detail::ecv1_activation_record * create_context( StackAlloc && salloc,
- Fn && fn, Args && ... args) {
- typedef detail::ecv1_capture_record<
- StackAlloc, Fn, Args ...
- > capture_t;
-
- auto sctx = salloc.allocate();
- // reserve space for control structure
-#if defined(BOOST_NO_CXX11_CONSTEXPR) || defined(BOOST_NO_CXX11_STD_ALIGN)
- const std::size_t size = sctx.size - sizeof( capture_t);
- void * sp = static_cast< char * >( sctx.sp) - sizeof( capture_t);
-#else
- constexpr std::size_t func_alignment = 64; // alignof( capture_t);
- constexpr std::size_t func_size = sizeof( capture_t);
- // reserve space on stack
- void * sp = static_cast< char * >( sctx.sp) - func_size - func_alignment;
- // align sp pointer
- std::size_t space = func_size + func_alignment;
- sp = std::align( func_alignment, func_size, sp, space);
- BOOST_ASSERT( nullptr != sp);
- // calculate remaining size
- const std::size_t size = sctx.size - ( static_cast< char * >( sctx.sp) - static_cast< char * >( sp) );
-#endif
- // create fast-context
- const detail::fcontext_t fctx = detail::make_fcontext( sp, size, & execution_context::entry_func< capture_t >);
- BOOST_ASSERT( nullptr != fctx);
- // get current activation record
- auto curr = execution_context::current().ptr_;
- // placment new for control structure on fast-context stack
- return ::new ( sp) capture_t{
- sctx, std::forward< StackAlloc >( salloc), fctx, curr.get(), std::forward< Fn >( fn), std::forward< Args >( args) ... };
- }
-
- template< typename StackAlloc, typename Fn, typename ... Args >
- static detail::ecv1_activation_record * create_context( preallocated palloc, StackAlloc && salloc,
- Fn && fn, Args && ... args) {
- typedef detail::ecv1_capture_record<
- StackAlloc, Fn, Args ...
- > capture_t;
-
- // reserve space for control structure
-#if defined(BOOST_NO_CXX11_CONSTEXPR) || defined(BOOST_NO_CXX11_STD_ALIGN)
- const std::size_t size = palloc.size - sizeof( capture_t);
- void * sp = static_cast< char * >( palloc.sp) - sizeof( capture_t);
-#else
- constexpr std::size_t func_alignment = 64; // alignof( capture_t);
- constexpr std::size_t func_size = sizeof( capture_t);
- // reserve space on stack
- void * sp = static_cast< char * >( palloc.sp) - func_size - func_alignment;
- // align sp pointer
- std::size_t space = func_size + func_alignment;
- sp = std::align( func_alignment, func_size, sp, space);
- BOOST_ASSERT( nullptr != sp);
- // calculate remaining size
- const std::size_t size = palloc.size - ( static_cast< char * >( palloc.sp) - static_cast< char * >( sp) );
-#endif
- // create fast-context
- const detail::fcontext_t fctx = detail::make_fcontext( sp, size, & execution_context::entry_func< capture_t >);
- BOOST_ASSERT( nullptr != fctx);
- // get current activation record
- auto curr = execution_context::current().ptr_;
- // placment new for control structure on fast-context stack
- return ::new ( sp) capture_t{
- palloc.sctx, std::forward< StackAlloc >( salloc), fctx, curr.get(), std::forward< Fn >( fn), std::forward< Args >( args) ... };
- }
-
- execution_context() noexcept :
- // default constructed with current ecv1_activation_record
- ptr_{ detail::ecv1_activation_record::current() } {
- }
-
-public:
- static execution_context current() noexcept;
-
-#if defined(BOOST_USE_SEGMENTED_STACKS)
- template< typename Fn,
- typename ... Args,
- typename = detail::disable_overload< execution_context, Fn >
- >
- execution_context( Fn && fn, Args && ... args) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- ptr_{ create_context( segmented_stack(),
- std::forward< Fn >( fn),
- std::forward< Args >( args) ...) } {
- ptr_->resume( ptr_.get() );
- }
-
- template< typename Fn,
- typename ... Args
- >
- execution_context( std::allocator_arg_t, segmented_stack salloc, Fn && fn, Args && ... args) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- ptr_{ create_context( salloc,
- std::forward< Fn >( fn),
- std::forward< Args >( args) ...) } {
- ptr_->resume( ptr_.get() );
- }
-
- template< typename Fn,
- typename ... Args
- >
- execution_context( std::allocator_arg_t, preallocated palloc, segmented_stack salloc, Fn && fn, Args && ... args) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- ptr_{ create_context( palloc, salloc,
- std::forward< Fn >( fn),
- std::forward< Args >( args) ...) } {
- ptr_->resume( ptr_.get() );
- }
-#else
- template< typename Fn,
- typename ... Args,
- typename = detail::disable_overload< execution_context, Fn >
- >
- execution_context( Fn && fn, Args && ... args) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- ptr_{ create_context( fixedsize_stack(),
- std::forward< Fn >( fn),
- std::forward< Args >( args) ...) } {
- ptr_->resume( ptr_.get() );
- }
-
- template< typename StackAlloc,
- typename Fn,
- typename ... Args
- >
- execution_context( std::allocator_arg_t, StackAlloc && salloc, Fn && fn, Args && ... args) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- ptr_{ create_context( std::forward< StackAlloc >( salloc),
- std::forward< Fn >( fn),
- std::forward< Args >( args) ...) } {
- ptr_->resume( ptr_.get() );
- }
-
- template< typename StackAlloc,
- typename Fn,
- typename ... Args
- >
- execution_context( std::allocator_arg_t, preallocated palloc, StackAlloc && salloc, Fn && fn, Args && ... args) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- ptr_{ create_context( palloc, std::forward< StackAlloc >( salloc),
- std::forward< Fn >( fn),
- std::forward< Args >( args) ...) } {
- ptr_->resume( ptr_.get() );
- }
-#endif
-
- execution_context( execution_context const& other) noexcept :
- ptr_{ other.ptr_ } {
- }
-
- execution_context( execution_context && other) noexcept :
- ptr_{ other.ptr_ } {
- other.ptr_.reset();
- }
-
- execution_context & operator=( execution_context const& other) noexcept {
- // intrusive_ptr<> does not test for self-assignment
- if ( this == & other) return * this;
- ptr_ = other.ptr_;
- return * this;
- }
-
- execution_context & operator=( execution_context && other) noexcept {
- if ( this == & other) return * this;
- execution_context tmp{ std::move( other) };
- swap( tmp);
- return * this;
- }
-
- void * operator()( void * vp = nullptr) {
- return ptr_->resume( vp);
- }
-
- template< typename Fn >
- void * operator()( exec_ontop_arg_t, Fn && fn, void * vp = nullptr) {
- return ptr_->resume_ontop( vp,
- std::forward< Fn >( fn) );
- }
-
- explicit operator bool() const noexcept {
- return nullptr != ptr_.get();
- }
-
- bool operator!() const noexcept {
- return nullptr == ptr_.get();
- }
-
- bool operator==( execution_context const& other) const noexcept {
- return ptr_ == other.ptr_;
- }
-
- bool operator!=( execution_context const& other) const noexcept {
- return ptr_ != other.ptr_;
- }
-
- bool operator<( execution_context const& other) const noexcept {
- return ptr_ < other.ptr_;
- }
-
- bool operator>( execution_context const& other) const noexcept {
- return other.ptr_ < ptr_;
- }
-
- bool operator<=( execution_context const& other) const noexcept {
- return ! ( * this > other);
- }
-
- bool operator>=( execution_context const& other) const noexcept {
- return ! ( * this < other);
- }
-
- template< typename charT, class traitsT >
- friend std::basic_ostream< charT, traitsT > &
- operator<<( std::basic_ostream< charT, traitsT > & os, execution_context const& other) {
- if ( nullptr != other.ptr_) {
- return os << other.ptr_;
- } else {
- return os << "{not-a-context}";
- }
- }
-
- void swap( execution_context & other) noexcept {
- ptr_.swap( other.ptr_);
- }
-};
-
-inline
-void swap( execution_context & l, execution_context & r) noexcept {
- l.swap( r);
-}
-
-}}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_CONTEXT_EXECUTION_CONTEXT_V1_H
diff --git a/contrib/restricted/boost/context/include/boost/context/execution_context_v2.hpp b/contrib/restricted/boost/context/include/boost/context/execution_context_v2.hpp
deleted file mode 100644
index 22a5502603..0000000000
--- a/contrib/restricted/boost/context/include/boost/context/execution_context_v2.hpp
+++ /dev/null
@@ -1,499 +0,0 @@
-
-// Copyright Oliver Kowalke 2014.
-// 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)
-
-#ifndef BOOST_CONTEXT_EXECUTION_CONTEXT_V2_H
-#define BOOST_CONTEXT_EXECUTION_CONTEXT_V2_H
-
-#include <boost/context/detail/config.hpp>
-
-#include <algorithm>
-#include <cstddef>
-#include <cstdint>
-#include <cstdlib>
-#include <exception>
-#include <functional>
-#include <memory>
-#include <ostream>
-#include <tuple>
-#include <utility>
-
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-#include <boost/intrusive_ptr.hpp>
-
-#if defined(BOOST_NO_CXX17_STD_APPLY)
-#include <boost/context/detail/apply.hpp>
-#endif
-#include <boost/context/detail/disable_overload.hpp>
-#include <boost/context/detail/exception.hpp>
-#include <boost/context/detail/exchange.hpp>
-#include <boost/context/detail/fcontext.hpp>
-#include <boost/context/detail/tuple.hpp>
-#include <boost/context/fixedsize_stack.hpp>
-#include <boost/context/flags.hpp>
-#include <boost/context/preallocated.hpp>
-#include <boost/context/segmented_stack.hpp>
-#include <boost/context/stack_context.hpp>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-
-#if defined(BOOST_MSVC)
-# pragma warning(push)
-# pragma warning(disable: 4702)
-#endif
-
-namespace boost {
-namespace context {
-namespace detail {
-
-transfer_t ecv2_context_unwind( transfer_t);
-
-template< typename Rec >
-transfer_t ecv2_context_exit( transfer_t) noexcept;
-
-template< typename Rec >
-void ecv2_context_etry( transfer_t) noexcept;
-
-template< typename Ctx, typename Fn, typename ... Args >
-transfer_t ecv2_context_ontop( transfer_t);
-
-template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
-fcontext_t ecv2_context_create( StackAlloc &&, Fn &&, Params && ...);
-
-template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
-fcontext_t ecv2_context_create( preallocated, StackAlloc &&, Fn &&, Params && ...);
-
-template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
-class ecv2_record {
-private:
- typename std::decay< StackAlloc >::type salloc_;
- stack_context sctx_;
- typename std::decay< Fn >::type fn_;
- std::tuple< typename std::decay< Params >::type ... > params_;
-
- static void destroy( ecv2_record * p) noexcept {
- typename std::decay< StackAlloc >::type salloc = std::move( p->salloc_);
- stack_context sctx = p->sctx_;
- // deallocate ecv2_record
- p->~ecv2_record();
- // destroy stack with stack allocator
- salloc.deallocate( sctx);
- }
-
-public:
- ecv2_record( stack_context sctx, StackAlloc && salloc,
- Fn && fn, Params && ... params) noexcept :
- salloc_( std::forward< StackAlloc >( salloc)),
- sctx_( sctx),
- fn_( std::forward< Fn >( fn) ),
- params_( std::forward< Params >( params) ... ) {
- }
-
- ecv2_record( ecv2_record const&) = delete;
- ecv2_record & operator=( ecv2_record const&) = delete;
-
- void deallocate() noexcept {
- destroy( this);
- }
-
- transfer_t run( transfer_t t) {
- Ctx from{ t.fctx };
- typename Ctx::args_tpl_t args = std::move( std::get<1>( * static_cast< std::tuple< std::exception_ptr, typename Ctx::args_tpl_t > * >( t.data) ) );
- auto tpl = std::tuple_cat(
- params_,
- std::forward_as_tuple( std::move( from) ),
- std::move( args) );
- // invoke context-function
-#if defined(BOOST_NO_CXX17_STD_APPLY)
- Ctx cc = boost::context::detail::apply( std::move( fn_), std::move( tpl) );
-#else
- Ctx cc = std::apply( std::move( fn_), std::move( tpl) );
-#endif
- return { exchange( cc.fctx_, nullptr), nullptr };
- }
-};
-
-}
-
-inline namespace v2 {
-
-template< typename ... Args >
-class execution_context {
-private:
- friend class ontop_error;
-
- typedef std::tuple< Args ... > args_tpl_t;
- typedef std::tuple< execution_context, typename std::decay< Args >::type ... > ret_tpl_t;
-
- template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
- friend class detail::ecv2_record;
-
- template< typename Ctx, typename Fn, typename ... ArgsT >
- friend detail::transfer_t detail::ecv2_context_ontop( detail::transfer_t);
-
- detail::fcontext_t fctx_{ nullptr };
-
- execution_context( detail::fcontext_t fctx) noexcept :
- fctx_( fctx) {
- }
-
-public:
- execution_context() noexcept = default;
-
-#if defined(BOOST_USE_SEGMENTED_STACKS)
- // segmented-stack requires to preserve the segments of the `current` context
- // which is not possible (no global pointer to current context)
- template< typename Fn, typename ... Params >
- execution_context( std::allocator_arg_t, segmented_stack, Fn &&, Params && ...) = delete;
-
- template< typename Fn, typename ... Params >
- execution_context( std::allocator_arg_t, preallocated, segmented_stack, Fn &&, Params && ...) = delete;
-#else
- template< typename Fn,
- typename ... Params,
- typename = detail::disable_overload< execution_context, Fn >
- >
- execution_context( Fn && fn, Params && ... params) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- fctx_( detail::ecv2_context_create< execution_context >(
- fixedsize_stack(),
- std::forward< Fn >( fn),
- std::forward< Params >( params) ... ) ) {
- }
-
- template< typename StackAlloc,
- typename Fn,
- typename ... Params
- >
- execution_context( std::allocator_arg_t, StackAlloc && salloc, Fn && fn, Params && ... params) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- fctx_( detail::ecv2_context_create< execution_context >(
- std::forward< StackAlloc >( salloc),
- std::forward< Fn >( fn),
- std::forward< Params >( params) ... ) ) {
- }
-
- template< typename StackAlloc,
- typename Fn,
- typename ... Params
- >
- execution_context( std::allocator_arg_t, preallocated palloc, StackAlloc && salloc, Fn && fn, Params && ... params) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- fctx_( detail::ecv2_context_create< execution_context >(
- palloc, std::forward< StackAlloc >( salloc),
- std::forward< Fn >( fn),
- std::forward< Params >( params) ... ) ) {
- }
-#endif
-
- ~execution_context() {
- if ( nullptr != fctx_) {
- detail::ontop_fcontext( detail::exchange( fctx_, nullptr), nullptr, detail::ecv2_context_unwind);
- }
- }
-
- execution_context( execution_context && other) noexcept :
- fctx_( other.fctx_) {
- other.fctx_ = nullptr;
- }
-
- execution_context & operator=( execution_context && other) noexcept {
- if ( this != & other) {
- execution_context tmp = std::move( other);
- swap( tmp);
- }
- return * this;
- }
-
- execution_context( execution_context const& other) noexcept = delete;
- execution_context & operator=( execution_context const& other) noexcept = delete;
-
- ret_tpl_t operator()( Args ... args);
-
- template< typename Fn >
- ret_tpl_t operator()( exec_ontop_arg_t, Fn && fn, Args ... args);
-
- explicit operator bool() const noexcept {
- return nullptr != fctx_;
- }
-
- bool operator!() const noexcept {
- return nullptr == fctx_;
- }
-
- bool operator==( execution_context const& other) const noexcept {
- return fctx_ == other.fctx_;
- }
-
- bool operator!=( execution_context const& other) const noexcept {
- return fctx_ != other.fctx_;
- }
-
- bool operator<( execution_context const& other) const noexcept {
- return fctx_ < other.fctx_;
- }
-
- bool operator>( execution_context const& other) const noexcept {
- return other.fctx_ < fctx_;
- }
-
- bool operator<=( execution_context const& other) const noexcept {
- return ! ( * this > other);
- }
-
- bool operator>=( execution_context const& other) const noexcept {
- return ! ( * this < other);
- }
-
- template< typename charT, class traitsT >
- friend std::basic_ostream< charT, traitsT > &
- operator<<( std::basic_ostream< charT, traitsT > & os, execution_context const& other) {
- if ( nullptr != other.fctx_) {
- return os << other.fctx_;
- } else {
- return os << "{not-a-context}";
- }
- }
-
- void swap( execution_context & other) noexcept {
- std::swap( fctx_, other.fctx_);
- }
-};
-
-class ontop_error : public std::exception {
-private:
- detail::fcontext_t fctx_;
-
-public:
- ontop_error( detail::fcontext_t fctx) noexcept :
- fctx_{ fctx } {
- }
-
- template< typename ... Args >
- execution_context< Args ... > get_context() const noexcept {
- return execution_context< Args ... >{ fctx_ };
- }
-};
-
-template< typename ... Args >
-typename execution_context< Args ... >::ret_tpl_t
-execution_context< Args ... >::operator()( Args ... args) {
- BOOST_ASSERT( nullptr != fctx_);
- args_tpl_t data( std::forward< Args >( args) ... );
- auto p = std::make_tuple( std::exception_ptr{}, std::move( data) );
- detail::transfer_t t = detail::jump_fcontext( detail::exchange( fctx_, nullptr), & p);
- if ( nullptr != t.data) {
- auto p = static_cast< std::tuple< std::exception_ptr, args_tpl_t > * >( t.data);
- std::exception_ptr eptr = std::get< 0 >( * p);
- if ( eptr) {
- try {
- std::rethrow_exception( eptr);
- } catch (...) {
- std::throw_with_nested( ontop_error{ t.fctx } );
- }
- }
- data = std::move( std::get< 1 >( * p) );
- }
- return std::tuple_cat( std::forward_as_tuple( execution_context( t.fctx) ), std::move( data) );
-}
-
-template< typename ... Args >
-template< typename Fn >
-typename execution_context< Args ... >::ret_tpl_t
-execution_context< Args ... >::operator()( exec_ontop_arg_t, Fn && fn, Args ... args) {
- BOOST_ASSERT( nullptr != fctx_);
- args_tpl_t data{ std::forward< Args >( args) ... };
- auto p = std::make_tuple( fn, std::make_tuple( std::exception_ptr{}, std::move( data) ) );
- detail::transfer_t t = detail::ontop_fcontext(
- detail::exchange( fctx_, nullptr),
- & p,
- detail::ecv2_context_ontop< execution_context, Fn, Args ... >);
- if ( nullptr != t.data) {
- auto p = static_cast< std::tuple< std::exception_ptr, args_tpl_t > * >( t.data);
- std::exception_ptr eptr = std::get< 0 >( * p);
- if ( eptr) {
- try {
- std::rethrow_exception( eptr);
- } catch (...) {
- std::throw_with_nested( ontop_error{ t.fctx } );
- }
- }
- data = std::move( std::get< 1 >( * p) );
- }
- return std::tuple_cat( std::forward_as_tuple( execution_context( t.fctx) ), std::move( data) );
-}
-
-}
-
-namespace detail {
-
-template< int N >
-struct helper {
- template< typename T >
- static T convert( T && t) noexcept {
- return std::forward< T >( t);
- }
-};
-
-template<>
-struct helper< 1 > {
- template< typename T >
- static std::tuple< T > convert( T && t) noexcept {
- return std::make_tuple( std::forward< T >( t) );
- }
-};
-
-inline
-transfer_t ecv2_context_unwind( transfer_t t) {
- throw forced_unwind( t.fctx);
- return { nullptr, nullptr };
-}
-
-template< typename Rec >
-transfer_t ecv2_context_exit( transfer_t t) noexcept {
- Rec * rec = static_cast< Rec * >( t.data);
- // destroy context stack
- rec->deallocate();
- return { nullptr, nullptr };
-}
-
-template< typename Rec >
-void ecv2_context_etry( transfer_t t_) noexcept {
- // transfer control structure to the context-stack
- Rec * rec = static_cast< Rec * >( t_.data);
- BOOST_ASSERT( nullptr != rec);
- transfer_t t = { nullptr, nullptr };
- try {
- // jump back to `ecv2_context_create()`
- t = jump_fcontext( t_.fctx, nullptr);
- // start executing
- t = rec->run( t);
- } catch ( forced_unwind const& e) {
- t = { e.fctx, nullptr };
- }
- BOOST_ASSERT( nullptr != t.fctx);
- // destroy context-stack of `this`context on next context
- ontop_fcontext( t.fctx, rec, ecv2_context_exit< Rec >);
- BOOST_ASSERT_MSG( false, "context already terminated");
-}
-
-template< typename Ctx, typename Fn, typename ... Args >
-transfer_t ecv2_context_ontop( transfer_t t) {
- auto p = static_cast< std::tuple< Fn, std::tuple< std::exception_ptr, std::tuple< Args ... > > > * >( t.data);
- BOOST_ASSERT( nullptr != p);
- typename std::decay< Fn >::type fn = std::forward< Fn >( std::get< 0 >( * p) );
- auto args = std::move( std::get< 1 >( std::get< 1 >( * p) ) );
- try {
- // execute function
-#if defined(BOOST_NO_CXX17_STD_APPLY)
- std::get< 1 >( std::get< 1 >( * p) ) = helper< sizeof ... (Args) >::convert( boost::context::detail::apply( fn, std::move( args) ) );
-#else
- std::get< 1 >( std::get< 1 >( * p) ) = helper< sizeof ... (Args) >::convert( std::apply( fn, std::move( args) ) );
-#endif
- } catch (...) {
- std::get< 0 >( std::get< 1 >( * p) ) = std::current_exception();
- }
- // apply returned data
- return { t.fctx, & std::get< 1 >( * p) };
-}
-
-template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
-fcontext_t ecv2_context_create( StackAlloc && salloc, Fn && fn, Params && ... params) {
- typedef ecv2_record< Ctx, StackAlloc, Fn, Params ... > ecv2_record_t;
-
- auto sctx = salloc.allocate();
- // reserve space for control structure
-#if defined(BOOST_NO_CXX11_CONSTEXPR) || defined(BOOST_NO_CXX11_STD_ALIGN)
- const std::size_t size = sctx.size - sizeof( ecv2_record_t);
- void * sp = static_cast< char * >( sctx.sp) - sizeof( ecv2_record_t);
-#else
- constexpr std::size_t func_alignment = 64; // alignof( ecv2_record_t);
- constexpr std::size_t func_size = sizeof( ecv2_record_t);
- // reserve space on stack
- void * sp = static_cast< char * >( sctx.sp) - func_size - func_alignment;
- // align sp pointer
- std::size_t space = func_size + func_alignment;
- sp = std::align( func_alignment, func_size, sp, space);
- BOOST_ASSERT( nullptr != sp);
- // calculate remaining size
- const std::size_t size = sctx.size - ( static_cast< char * >( sctx.sp) - static_cast< char * >( sp) );
-#endif
- // create fast-context
- const fcontext_t fctx = make_fcontext( sp, size, & ecv2_context_etry< ecv2_record_t >);
- BOOST_ASSERT( nullptr != fctx);
- // placment new for control structure on context-stack
- auto rec = ::new ( sp) ecv2_record_t{
- sctx, std::forward< StackAlloc >( salloc), std::forward< Fn >( fn), std::forward< Params >( params) ... };
- // transfer control structure to context-stack
- return jump_fcontext( fctx, rec).fctx;
-}
-
-template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
-fcontext_t ecv2_context_create( preallocated palloc, StackAlloc && salloc, Fn && fn, Params && ... params) {
- typedef ecv2_record< Ctx, StackAlloc, Fn, Params ... > ecv2_record_t;
-
- // reserve space for control structure
-#if defined(BOOST_NO_CXX11_CONSTEXPR) || defined(BOOST_NO_CXX11_STD_ALIGN)
- const std::size_t size = palloc.size - sizeof( ecv2_record_t);
- void * sp = static_cast< char * >( palloc.sp) - sizeof( ecv2_record_t);
-#else
- constexpr std::size_t func_alignment = 64; // alignof( ecv2_record_t);
- constexpr std::size_t func_size = sizeof( ecv2_record_t);
- // reserve space on stack
- void * sp = static_cast< char * >( palloc.sp) - func_size - func_alignment;
- // align sp pointer
- std::size_t space = func_size + func_alignment;
- sp = std::align( func_alignment, func_size, sp, space);
- BOOST_ASSERT( nullptr != sp);
- // calculate remaining size
- const std::size_t size = palloc.size - ( static_cast< char * >( palloc.sp) - static_cast< char * >( sp) );
-#endif
- // create fast-context
- const fcontext_t fctx = make_fcontext( sp, size, & ecv2_context_etry< ecv2_record_t >);
- BOOST_ASSERT( nullptr != fctx);
- // placment new for control structure on context-stack
- auto rec = ::new ( sp) ecv2_record_t{
- palloc.sctx, std::forward< StackAlloc >( salloc), std::forward< Fn >( fn), std::forward< Params >( params) ... };
- // transfer control structure to context-stack
- return jump_fcontext( fctx, rec).fctx;
-}
-
-}
-
-#include <boost/context/execution_context_v2_void.ipp>
-
-inline namespace v2 {
-
-template< typename ... Args >
-void swap( execution_context< Args ... > & l, execution_context< Args ... > & r) noexcept {
- l.swap( r);
-}
-
-}}}
-
-#if defined(BOOST_MSVC)
-# pragma warning(pop)
-#endif
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-
-#endif // BOOST_CONTEXT_EXECUTION_CONTEXT_V2_H
diff --git a/contrib/restricted/boost/context/include/boost/context/execution_context_v2_void.ipp b/contrib/restricted/boost/context/include/boost/context/execution_context_v2_void.ipp
deleted file mode 100644
index f262a0c9c9..0000000000
--- a/contrib/restricted/boost/context/include/boost/context/execution_context_v2_void.ipp
+++ /dev/null
@@ -1,327 +0,0 @@
-
-// Copyright Oliver Kowalke 2014.
-// 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)
-
-namespace detail {
-
-template< typename Ctx, typename Fn >
-transfer_t ecv2_context_ontop_void( transfer_t);
-
-template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
-fcontext_t ecv2_context_create_void( StackAlloc &&, Fn &&, Params && ...);
-
-template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
-fcontext_t ecv2_context_create_void( preallocated, StackAlloc &&, Fn &&, Params && ...);
-
-template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
-class ecv2_record_void {
-private:
- typename std::decay< StackAlloc >::type salloc_;
- stack_context sctx_;
- typename std::decay< Fn >::type fn_;
- std::tuple< typename std::decay< Params >::type ... > params_;
-
- static void destroy( ecv2_record_void * p) noexcept {
- typename std::decay< StackAlloc >::type salloc = std::move( p->salloc_);
- stack_context sctx = p->sctx_;
- // deallocate record
- p->~ecv2_record_void();
- // destroy stack with stack allocator
- salloc.deallocate( sctx);
- }
-
-public:
- ecv2_record_void( stack_context sctx, StackAlloc && salloc,
- Fn && fn, Params && ... params) noexcept :
- salloc_( std::forward< StackAlloc >( salloc) ),
- sctx_( sctx),
- fn_( std::forward< Fn >( fn) ),
- params_( std::forward< Params >( params) ... ) {
- }
-
- ecv2_record_void( ecv2_record_void const&) = delete;
- ecv2_record_void & operator=( ecv2_record_void const&) = delete;
-
- void deallocate() noexcept {
- destroy( this);
- }
-
- transfer_t run( transfer_t t) {
- Ctx from{ t.fctx };
- // invoke context-function
-#if defined(BOOST_NO_CXX17_STD_APPLY)
- Ctx cc = boost::context::detail::apply( fn_, std::tuple_cat( params_, std::forward_as_tuple( std::move( from) ) ) );
-#else
- Ctx cc = std::apply( fn_, std::tuple_cat( params_, std::forward_as_tuple( std::move( from) ) ) );
-#endif
- return { exchange( cc.fctx_, nullptr), nullptr };
- }
-};
-
-}
-
-inline namespace v2 {
-
-template<>
-class execution_context< void > {
-private:
- friend class ontop_error;
-
- template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
- friend class detail::ecv2_record_void;
-
- template< typename Ctx, typename Fn >
- friend detail::transfer_t detail::ecv2_context_ontop_void( detail::transfer_t);
-
- detail::fcontext_t fctx_{ nullptr };
-
- execution_context( detail::fcontext_t fctx) noexcept :
- fctx_( fctx) {
- }
-
-public:
- execution_context() noexcept = default;
-
-#if defined(BOOST_USE_SEGMENTED_STACKS)
- // segmented-stack requires to preserve the segments of the `current` context
- // which is not possible (no global pointer to current context)
- template< typename Fn, typename ... Params >
- execution_context( std::allocator_arg_t, segmented_stack, Fn &&, Params && ...) = delete;
-
- template< typename Fn, typename ... Params >
- execution_context( std::allocator_arg_t, preallocated, segmented_stack, Fn &&, Params && ...) = delete;
-#else
- template< typename Fn,
- typename ... Params,
- typename = detail::disable_overload< execution_context, Fn >
- >
- execution_context( Fn && fn, Params && ... params) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- fctx_( detail::ecv2_context_create_void< execution_context >(
- fixedsize_stack(),
- std::forward< Fn >( fn),
- std::forward< Params >( params) ... ) ) {
- }
-
- template< typename StackAlloc,
- typename Fn,
- typename ... Params
- >
- execution_context( std::allocator_arg_t, StackAlloc && salloc, Fn && fn, Params && ... params) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- fctx_( detail::ecv2_context_create_void< execution_context >(
- std::forward< StackAlloc >( salloc),
- std::forward< Fn >( fn),
- std::forward< Params >( params) ... ) ) {
- }
-
- template< typename StackAlloc,
- typename Fn,
- typename ... Params
- >
- execution_context( std::allocator_arg_t, preallocated palloc, StackAlloc && salloc, Fn && fn, Params && ... params) :
- // deferred execution of fn and its arguments
- // arguments are stored in std::tuple<>
- // non-type template parameter pack via std::index_sequence_for<>
- // preserves the number of arguments
- // used to extract the function arguments from std::tuple<>
- fctx_( detail::ecv2_context_create_void< execution_context >(
- palloc, std::forward< StackAlloc >( salloc),
- std::forward< Fn >( fn),
- std::forward< Params >( params) ... ) ) {
- }
-#endif
-
- ~execution_context() {
- if ( nullptr != fctx_) {
- detail::ontop_fcontext( detail::exchange( fctx_, nullptr), nullptr, detail::ecv2_context_unwind);
- }
- }
-
- execution_context( execution_context && other) noexcept :
- fctx_( other.fctx_) {
- other.fctx_ = nullptr;
- }
-
- execution_context & operator=( execution_context && other) noexcept {
- if ( this != & other) {
- execution_context tmp = std::move( other);
- swap( tmp);
- }
- return * this;
- }
-
- execution_context( execution_context const& other) noexcept = delete;
- execution_context & operator=( execution_context const& other) noexcept = delete;
-
- execution_context operator()() {
- BOOST_ASSERT( nullptr != fctx_);
- detail::transfer_t t = detail::jump_fcontext( detail::exchange( fctx_, nullptr), nullptr);
- if ( nullptr != t.data) {
- std::exception_ptr * eptr = static_cast< std::exception_ptr * >( t.data);
- try {
- std::rethrow_exception( * eptr);
- } catch (...) {
- std::throw_with_nested( ontop_error{ t.fctx } );
- }
- }
- return execution_context( t.fctx);
- }
-
- template< typename Fn >
- execution_context operator()( exec_ontop_arg_t, Fn && fn) {
- BOOST_ASSERT( nullptr != fctx_);
- auto p = std::make_tuple( fn, std::exception_ptr{} );
- detail::transfer_t t = detail::ontop_fcontext(
- detail::exchange( fctx_, nullptr),
- & p,
- detail::ecv2_context_ontop_void< execution_context, Fn >);
- if ( nullptr != t.data) {
- std::exception_ptr * eptr = static_cast< std::exception_ptr * >( t.data);
- try {
- std::rethrow_exception( * eptr);
- } catch (...) {
- std::throw_with_nested( ontop_error{ t.fctx } );
- }
- }
- return execution_context( t.fctx);
- }
-
- explicit operator bool() const noexcept {
- return nullptr != fctx_;
- }
-
- bool operator!() const noexcept {
- return nullptr == fctx_;
- }
-
- bool operator==( execution_context const& other) const noexcept {
- return fctx_ == other.fctx_;
- }
-
- bool operator!=( execution_context const& other) const noexcept {
- return fctx_ != other.fctx_;
- }
-
- bool operator<( execution_context const& other) const noexcept {
- return fctx_ < other.fctx_;
- }
-
- bool operator>( execution_context const& other) const noexcept {
- return other.fctx_ < fctx_;
- }
-
- bool operator<=( execution_context const& other) const noexcept {
- return ! ( * this > other);
- }
-
- bool operator>=( execution_context const& other) const noexcept {
- return ! ( * this < other);
- }
-
- template< typename charT, class traitsT >
- friend std::basic_ostream< charT, traitsT > &
- operator<<( std::basic_ostream< charT, traitsT > & os, execution_context const& other) {
- if ( nullptr != other.fctx_) {
- return os << other.fctx_;
- } else {
- return os << "{not-a-context}";
- }
- }
-
- void swap( execution_context & other) noexcept {
- std::swap( fctx_, other.fctx_);
- }
-};
-
-}
-
-namespace detail {
-
-template< typename Ctx, typename Fn >
-transfer_t ecv2_context_ontop_void( transfer_t t) {
- auto p = static_cast< std::tuple< Fn, std::exception_ptr > * >( t.data);
- BOOST_ASSERT( nullptr != p);
- typename std::decay< Fn >::type fn = std::forward< Fn >( std::get< 0 >( * p) );
- try {
- // execute function
- fn();
- } catch (...) {
- std::get< 1 >( * p) = std::current_exception();
- return { t.fctx, & std::get< 1 >( * p ) };
- }
- return { exchange( t.fctx, nullptr), nullptr };
-}
-
-template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
-fcontext_t ecv2_context_create_void( StackAlloc && salloc, Fn && fn, Params && ... params) {
- typedef ecv2_record_void< Ctx, StackAlloc, Fn, Params ... > record_t;
-
- auto sctx = salloc.allocate();
- // reserve space for control structure
-#if defined(BOOST_NO_CXX11_CONSTEXPR) || defined(BOOST_NO_CXX11_STD_ALIGN)
- const std::size_t size = sctx.size - sizeof( record_t);
- void * sp = static_cast< char * >( sctx.sp) - sizeof( record_t);
-#else
- constexpr std::size_t func_alignment = 64; // alignof( record_t);
- constexpr std::size_t func_size = sizeof( record_t);
- // reserve space on stack
- void * sp = static_cast< char * >( sctx.sp) - func_size - func_alignment;
- // align sp pointer
- std::size_t space = func_size + func_alignment;
- sp = std::align( func_alignment, func_size, sp, space);
- BOOST_ASSERT( nullptr != sp);
- // calculate remaining size
- const std::size_t size = sctx.size - ( static_cast< char * >( sctx.sp) - static_cast< char * >( sp) );
-#endif
- // create fast-context
- const fcontext_t fctx = make_fcontext( sp, size, & ecv2_context_etry< record_t >);
- BOOST_ASSERT( nullptr != fctx);
- // placment new for control structure on context-stack
- auto rec = ::new ( sp) record_t{
- sctx, std::forward< StackAlloc >( salloc), std::forward< Fn >( fn), std::forward< Params >( params) ... };
- // transfer control structure to context-stack
- return jump_fcontext( fctx, rec).fctx;
-}
-
-template< typename Ctx, typename StackAlloc, typename Fn, typename ... Params >
-fcontext_t ecv2_context_create_void( preallocated palloc, StackAlloc && salloc, Fn && fn, Params && ... params) {
- typedef ecv2_record_void< Ctx, StackAlloc, Fn, Params ... > record_t;
-
- // reserve space for control structure
-#if defined(BOOST_NO_CXX11_CONSTEXPR) || defined(BOOST_NO_CXX11_STD_ALIGN)
- const std::size_t size = palloc.size - sizeof( record_t);
- void * sp = static_cast< char * >( palloc.sp) - sizeof( record_t);
-#else
- constexpr std::size_t func_alignment = 64; // alignof( record_t);
- constexpr std::size_t func_size = sizeof( record_t);
- // reserve space on stack
- void * sp = static_cast< char * >( palloc.sp) - func_size - func_alignment;
- // align sp pointer
- std::size_t space = func_size + func_alignment;
- sp = std::align( func_alignment, func_size, sp, space);
- BOOST_ASSERT( nullptr != sp);
- // calculate remaining size
- const std::size_t size = palloc.size - ( static_cast< char * >( palloc.sp) - static_cast< char * >( sp) );
-#endif
- // create fast-context
- const fcontext_t fctx = make_fcontext( sp, size, & ecv2_context_etry< record_t >);
- BOOST_ASSERT( nullptr != fctx);
- // placment new for control structure on context-stack
- auto rec = ::new ( sp) record_t{
- palloc.sctx, std::forward< StackAlloc >( salloc), std::forward< Fn >( fn), std::forward< Params >( params) ... };
- // transfer control structure to context-stack
- return jump_fcontext( fctx, rec).fctx;
-}
-
-}
diff --git a/contrib/restricted/boost/context/include/boost/context/fiber_ucontext.hpp b/contrib/restricted/boost/context/include/boost/context/fiber_ucontext.hpp
index ae62389526..97537f0140 100644
--- a/contrib/restricted/boost/context/include/boost/context/fiber_ucontext.hpp
+++ b/contrib/restricted/boost/context/include/boost/context/fiber_ucontext.hpp
@@ -32,6 +32,7 @@ extern "C" {
#include <boost/assert.hpp>
#include <boost/config.hpp>
+#include <boost/predef.h>
#include <boost/context/detail/disable_overload.hpp>
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
@@ -53,6 +54,10 @@ extern "C" {
# include BOOST_ABI_PREFIX
#endif
+#ifdef BOOST_USE_TSAN
+#include <sanitizer/tsan_interface.h>
+#endif
+
namespace boost {
namespace context {
namespace detail {
@@ -82,6 +87,11 @@ struct BOOST_CONTEXT_DECL fiber_activation_record {
std::size_t stack_size{ 0 };
#endif
+#if defined(BOOST_USE_TSAN)
+ void * tsan_fiber{ nullptr };
+ bool destroy_tsan_fiber{ true };
+#endif
+
static fiber_activation_record *& current() noexcept;
// used for toplevel-context
@@ -92,6 +102,11 @@ struct BOOST_CONTEXT_DECL fiber_activation_record {
std::error_code( errno, std::system_category() ),
"getcontext() failed");
}
+
+#if defined(BOOST_USE_TSAN)
+ tsan_fiber = __tsan_get_current_fiber();
+ destroy_tsan_fiber = false;
+#endif
}
fiber_activation_record( stack_context sctx_) noexcept :
@@ -100,6 +115,10 @@ struct BOOST_CONTEXT_DECL fiber_activation_record {
}
virtual ~fiber_activation_record() {
+#if defined(BOOST_USE_TSAN)
+ if (destroy_tsan_fiber)
+ __tsan_destroy_fiber(tsan_fiber);
+#endif
}
fiber_activation_record( fiber_activation_record const&) = delete;
@@ -126,6 +145,9 @@ struct BOOST_CONTEXT_DECL fiber_activation_record {
__sanitizer_start_switch_fiber( & from->fake_stack, stack_bottom, stack_size);
}
#endif
+#if defined (BOOST_USE_TSAN)
+ __tsan_switch_to_fiber(tsan_fiber, 0);
+#endif
// context switch from parent context to `this`-context
::swapcontext( & from->uctx, & uctx);
#if defined(BOOST_USE_ASAN)
@@ -185,6 +207,9 @@ struct BOOST_CONTEXT_DECL fiber_activation_record {
#if defined(BOOST_USE_ASAN)
__sanitizer_start_switch_fiber( & from->fake_stack, stack_bottom, stack_size);
#endif
+#if defined (BOOST_USE_TSAN)
+ __tsan_switch_to_fiber(tsan_fiber, 0);
+#endif
// context switch from parent context to `this`-context
::swapcontext( & from->uctx, & uctx);
#if defined(BOOST_USE_ASAN)
@@ -209,7 +234,7 @@ struct BOOST_CONTEXT_DECL fiber_activation_record_initializer {
};
struct forced_unwind {
- fiber_activation_record * from{ nullptr };
+ fiber_activation_record * from{ nullptr };
forced_unwind( fiber_activation_record * from_) noexcept :
from{ from_ } {
@@ -287,11 +312,18 @@ static fiber_activation_record * create_fiber1( StackAlloc && salloc, Fn && fn)
reinterpret_cast< uintptr_t >( sctx.sp) - static_cast< uintptr_t >( sctx.size) );
// create user-context
if ( BOOST_UNLIKELY( 0 != ::getcontext( & record->uctx) ) ) {
+ record->~capture_t();
+ salloc.deallocate( sctx);
throw std::system_error(
std::error_code( errno, std::system_category() ),
"getcontext() failed");
}
+#if BOOST_OS_BSD_FREE
+ // because FreeBSD defines stack_t::ss_sp as char *
+ record->uctx.uc_stack.ss_sp = static_cast< char * >( stack_bottom);
+#else
record->uctx.uc_stack.ss_sp = stack_bottom;
+#endif
// 64byte gap between control structure and stack top
record->uctx.uc_stack.ss_size = reinterpret_cast< uintptr_t >( storage) -
reinterpret_cast< uintptr_t >( stack_bottom) - static_cast< uintptr_t >( 64);
@@ -301,6 +333,9 @@ static fiber_activation_record * create_fiber1( StackAlloc && salloc, Fn && fn)
record->stack_bottom = record->uctx.uc_stack.ss_sp;
record->stack_size = record->uctx.uc_stack.ss_size;
#endif
+#if defined (BOOST_USE_TSAN)
+ record->tsan_fiber = __tsan_create_fiber(0);
+#endif
return record;
}
@@ -320,11 +355,18 @@ static fiber_activation_record * create_fiber2( preallocated palloc, StackAlloc
reinterpret_cast< uintptr_t >( palloc.sctx.sp) - static_cast< uintptr_t >( palloc.sctx.size) );
// create user-context
if ( BOOST_UNLIKELY( 0 != ::getcontext( & record->uctx) ) ) {
+ record->~capture_t();
+ salloc.deallocate( palloc.sctx);
throw std::system_error(
std::error_code( errno, std::system_category() ),
"getcontext() failed");
}
+#if BOOST_OS_BSD_FREE
+ // because FreeBSD defines stack_t::ss_sp as char *
+ record->uctx.uc_stack.ss_sp = static_cast< char * >( stack_bottom);
+#else
record->uctx.uc_stack.ss_sp = stack_bottom;
+#endif
// 64byte gap between control structure and stack top
record->uctx.uc_stack.ss_size = reinterpret_cast< uintptr_t >( storage) -
reinterpret_cast< uintptr_t >( stack_bottom) - static_cast< uintptr_t >( 64);
@@ -334,6 +376,9 @@ static fiber_activation_record * create_fiber2( preallocated palloc, StackAlloc
record->stack_bottom = record->uctx.uc_stack.ss_sp;
record->stack_size = record->uctx.uc_stack.ss_size;
#endif
+#if defined (BOOST_USE_TSAN)
+ record->tsan_fiber = __tsan_create_fiber(0);
+#endif
return record;
}
@@ -462,29 +507,11 @@ public:
return nullptr == ptr_ || ptr_->terminated;
}
- bool operator==( fiber const& other) const noexcept {
- return ptr_ == other.ptr_;
- }
-
- bool operator!=( fiber const& other) const noexcept {
- return ptr_ != other.ptr_;
- }
-
bool operator<( fiber const& other) const noexcept {
return ptr_ < other.ptr_;
}
- bool operator>( fiber const& other) const noexcept {
- return other.ptr_ < ptr_;
- }
-
- bool operator<=( fiber const& other) const noexcept {
- return ! ( * this > other);
- }
-
- bool operator>=( fiber const& other) const noexcept {
- return ! ( * this < other);
- }
+ #if !defined(BOOST_EMBTC)
template< typename charT, class traitsT >
friend std::basic_ostream< charT, traitsT > &
@@ -496,16 +523,40 @@ public:
}
}
+ #else
+
+ template< typename charT, class traitsT >
+ friend std::basic_ostream< charT, traitsT > &
+ operator<<( std::basic_ostream< charT, traitsT > & os, fiber const& other);
+
+ #endif
+
void swap( fiber & other) noexcept {
std::swap( ptr_, other.ptr_);
}
};
+#if defined(BOOST_EMBTC)
+
+ template< typename charT, class traitsT >
+ inline std::basic_ostream< charT, traitsT > &
+ operator<<( std::basic_ostream< charT, traitsT > & os, fiber const& other) {
+ if ( nullptr != other.ptr_) {
+ return os << other.ptr_;
+ } else {
+ return os << "{not-a-context}";
+ }
+ }
+
+#endif
+
inline
void swap( fiber & l, fiber & r) noexcept {
l.swap( r);
}
+typedef fiber fiber_context;
+
}}
#ifdef BOOST_HAS_ABI_HEADERS
diff --git a/contrib/restricted/boost/context/include/boost/context/fiber_winfib.hpp b/contrib/restricted/boost/context/include/boost/context/fiber_winfib.hpp
index cfd570a2e7..727b3742af 100644
--- a/contrib/restricted/boost/context/include/boost/context/fiber_winfib.hpp
+++ b/contrib/restricted/boost/context/include/boost/context/fiber_winfib.hpp
@@ -85,8 +85,7 @@ struct BOOST_CONTEXT_DECL fiber_activation_record {
#else
fiber = ::ConvertThreadToFiber( nullptr);
if ( BOOST_UNLIKELY( nullptr == fiber) ) {
- DWORD err = ::GetLastError();
- BOOST_ASSERT( ERROR_ALREADY_FIBER == err);
+ BOOST_ASSERT( ERROR_ALREADY_FIBER == ::GetLastError());
fiber = ::GetCurrentFiber();
BOOST_ASSERT( nullptr != fiber);
BOOST_ASSERT( reinterpret_cast< LPVOID >( 0x1E00) != fiber);
@@ -185,7 +184,7 @@ struct BOOST_CONTEXT_DECL fiber_activation_record_initializer {
};
struct forced_unwind {
- fiber_activation_record * from{ nullptr };
+ fiber_activation_record * from{ nullptr };
explicit forced_unwind( fiber_activation_record * from_) :
from{ from_ } {
@@ -396,30 +395,12 @@ public:
return nullptr == ptr_ || ptr_->terminated;
}
- bool operator==( fiber const& other) const noexcept {
- return ptr_ == other.ptr_;
- }
-
- bool operator!=( fiber const& other) const noexcept {
- return ptr_ != other.ptr_;
- }
-
bool operator<( fiber const& other) const noexcept {
return ptr_ < other.ptr_;
}
-
- bool operator>( fiber const& other) const noexcept {
- return other.ptr_ < ptr_;
- }
-
- bool operator<=( fiber const& other) const noexcept {
- return ! ( * this > other);
- }
-
- bool operator>=( fiber const& other) const noexcept {
- return ! ( * this < other);
- }
-
+
+ #if !defined(BOOST_EMBTC)
+
template< typename charT, class traitsT >
friend std::basic_ostream< charT, traitsT > &
operator<<( std::basic_ostream< charT, traitsT > & os, fiber const& other) {
@@ -430,16 +411,40 @@ public:
}
}
+ #else
+
+ template< typename charT, class traitsT >
+ friend std::basic_ostream< charT, traitsT > &
+ operator<<( std::basic_ostream< charT, traitsT > & os, fiber const& other);
+
+ #endif
+
void swap( fiber & other) noexcept {
std::swap( ptr_, other.ptr_);
}
};
+#if defined(BOOST_EMBTC)
+
+ template< typename charT, class traitsT >
+ inline std::basic_ostream< charT, traitsT > &
+ operator<<( std::basic_ostream< charT, traitsT > & os, fiber const& other) {
+ if ( nullptr != other.ptr_) {
+ return os << other.ptr_;
+ } else {
+ return os << "{not-a-context}";
+ }
+ }
+
+#endif
+
inline
void swap( fiber & l, fiber & r) noexcept {
l.swap( r);
}
+typedef fiber fiber_context;
+
}}
#if defined(BOOST_MSVC)
diff --git a/contrib/restricted/boost/context/include/boost/context/fixedsize_stack.hpp b/contrib/restricted/boost/context/include/boost/context/fixedsize_stack.hpp
index 756b260bda..c309347935 100644
--- a/contrib/restricted/boost/context/include/boost/context/fixedsize_stack.hpp
+++ b/contrib/restricted/boost/context/include/boost/context/fixedsize_stack.hpp
@@ -18,6 +18,12 @@
#include <boost/context/stack_context.hpp>
#include <boost/context/stack_traits.hpp>
+#if defined(BOOST_CONTEXT_USE_MAP_STACK)
+extern "C" {
+#include <sys/mman.h>
+}
+#endif
+
#if defined(BOOST_USE_VALGRIND)
#include <valgrind/valgrind.h>
#endif
@@ -42,10 +48,17 @@ public:
}
stack_context allocate() {
+#if defined(BOOST_CONTEXT_USE_MAP_STACK)
+ void * vp = ::mmap( 0, size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_STACK, -1, 0);
+ if ( vp == MAP_FAILED) {
+ throw std::bad_alloc();
+ }
+#else
void * vp = std::malloc( size_);
if ( ! vp) {
throw std::bad_alloc();
}
+#endif
stack_context sctx;
sctx.size = size_;
sctx.sp = static_cast< char * >( vp) + sctx.size;
@@ -62,7 +75,11 @@ public:
VALGRIND_STACK_DEREGISTER( sctx.valgrind_stack_id);
#endif
void * vp = static_cast< char * >( sctx.sp) - sctx.size;
+#if defined(BOOST_CONTEXT_USE_MAP_STACK)
+ ::munmap( vp, sctx.size);
+#else
std::free( vp);
+#endif
}
};
diff --git a/contrib/restricted/boost/context/include/boost/context/stack_context.hpp b/contrib/restricted/boost/context/include/boost/context/stack_context.hpp
index 6e516a3adf..740d981dc7 100644
--- a/contrib/restricted/boost/context/include/boost/context/stack_context.hpp
+++ b/contrib/restricted/boost/context/include/boost/context/stack_context.hpp
@@ -21,7 +21,7 @@ namespace boost {
namespace context {
#if ! defined(BOOST_CONTEXT_NO_CXX11)
-struct stack_context {
+struct BOOST_CONTEXT_DECL stack_context {
# if defined(BOOST_USE_SEGMENTED_STACKS)
typedef void * segments_context[BOOST_CONTEXT_SEGMENTS];
# endif
@@ -36,7 +36,7 @@ struct stack_context {
# endif
};
#else
-struct stack_context {
+struct BOOST_CONTEXT_DECL stack_context {
# if defined(BOOST_USE_SEGMENTED_STACKS)
typedef void * segments_context[BOOST_CONTEXT_SEGMENTS];
# endif
diff --git a/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_elf_gas.S
index 551aaf5a78..48b9de51bb 100644
--- a/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_elf_gas.S
@@ -30,12 +30,18 @@
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
-
+# if defined __CET__
+# include <cet.h>
+# else
+# define _CET_ENDBR
+# endif
+.file "jump_x86_64_sysv_elf_gas.S"
.text
.globl jump_fcontext
.type jump_fcontext,@function
.align 16
jump_fcontext:
+ _CET_ENDBR
leaq -0x40(%rsp), %rsp /* prepare stack */
#if !defined(BOOST_USE_TSX)
@@ -68,7 +74,7 @@ jump_fcontext:
fldcw 0x4(%rsp) /* restore x87 control-word */
#endif
-#if defined(TLS_STACK_PROTECTOR)
+#if defined(BOOST_CONTEXT_TLS_STACK_PROTECTOR)
movq 0x8(%rsp), %rdx /* load stack guard */
movq %rdx, %fs:0x28 /* restore stack guard to TLS record */
#endif
@@ -83,10 +89,20 @@ jump_fcontext:
leaq 0x48(%rsp), %rsp /* prepare stack */
/* return transfer_t from jump */
+#if !defined(_ILP32)
/* RAX == fctx, RDX == data */
movq %rsi, %rdx
+#else
+ /* RAX == data:fctx */
+ salq $32, %rsi
+ orq %rsi, %rax
+#endif
/* pass transfer_t as first arg in context function */
+#if !defined(_ILP32)
/* RDI == fctx, RSI == data */
+#else
+ /* RDI == data:fctx */
+#endif
movq %rax, %rdi
/* indirect jump to context */
diff --git a/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_elf_gas.S
index d0753b95d6..0890fcfb27 100644
--- a/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_elf_gas.S
@@ -30,12 +30,18 @@
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
-
+# if defined __CET__
+# include <cet.h>
+# else
+# define _CET_ENDBR
+# endif
+.file "make_x86_64_sysv_elf_gas.S"
.text
.globl make_fcontext
.type make_fcontext,@function
.align 16
make_fcontext:
+ _CET_ENDBR
/* first arg of make_fcontext() == top of context-stack */
movq %rdi, %rax
@@ -55,7 +61,7 @@ make_fcontext:
/* save x87 control-word */
fnstcw 0x4(%rax)
-#if defined(TLS_STACK_PROTECTOR)
+#if defined(BOOST_CONTEXT_TLS_STACK_PROTECTOR)
/* save stack guard */
movq %fs:0x28, %rcx /* read stack guard from TLS record */
movq %rcx, 0x8(%rsp) /* save stack guard */
@@ -76,6 +82,7 @@ make_fcontext:
ret /* return pointer to context-data */
trampoline:
+ _CET_ENDBR
/* store return address on stack */
/* fix stack alignment */
push %rbp
@@ -83,6 +90,7 @@ trampoline:
jmp *%rbx
finish:
+ _CET_ENDBR
/* exit code is zero */
xorq %rdi, %rdi
/* exit application */
diff --git a/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_elf_gas.S
index 95e9981f24..6b35a7c955 100644
--- a/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_elf_gas.S
@@ -30,12 +30,18 @@
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
-
+# if defined __CET__
+# include <cet.h>
+# else
+# define _CET_ENDBR
+# endif
+.file "ontop_x86_64_sysv_elf_gas.S"
.text
.globl ontop_fcontext
.type ontop_fcontext,@function
.align 16
ontop_fcontext:
+ _CET_ENDBR
/* preserve ontop-function in R8 */
movq %rdx, %r8
@@ -46,7 +52,7 @@ ontop_fcontext:
fnstcw 0x4(%rsp) /* save x87 control-word */
#endif
-#if defined(TLS_STACK_PROTECTOR)
+#if defined(BOOST_CONTEXT_TLS_STACK_PROTECTOR)
movq %fs:0x28, %rcx /* read stack guard from TLS record */
movq %rcx, 0x8(%rsp) /* save stack guard */
#endif
@@ -69,7 +75,7 @@ ontop_fcontext:
fldcw 0x4(%rsp) /* restore x87 control-word */
#endif
-#if defined(TLS_STACK_PROTECTOR)
+#if defined(BOOST_CONTEXT_TLS_STACK_PROTECTOR)
movq 0x8(%rsp), %rdx /* load stack guard */
movq %rdx, %fs:0x28 /* restore stack guard to TLS record */
#endif
@@ -84,10 +90,20 @@ ontop_fcontext:
leaq 0x40(%rsp), %rsp /* prepare stack */
/* return transfer_t from jump */
+#if !defined(_ILP32)
/* RAX == fctx, RDX == data */
movq %rsi, %rdx
+#else
+ /* RAX == data:fctx */
+ salq $32, %rsi
+ orq %rsi, %rax
+#endif
/* pass transfer_t as first arg in context function */
+#if !defined(_ILP32)
/* RDI == fctx, RSI == data */
+#else
+ /* RDI == data:fctx */
+#endif
movq %rax, %rdi
/* keep return-address on stack */
diff --git a/contrib/restricted/boost/context/src/continuation.cpp b/contrib/restricted/boost/context/src/continuation.cpp
index 0779baaba8..2d7769602a 100644
--- a/contrib/restricted/boost/context/src/continuation.cpp
+++ b/contrib/restricted/boost/context/src/continuation.cpp
@@ -8,8 +8,6 @@
#include "boost/context/continuation_ucontext.hpp"
#elif defined(BOOST_USE_WINFIB)
#include "boost/context/continuation_winfib.hpp"
-#else
-#include "boost/context/execution_context.hpp"
#endif
#include <boost/config.hpp>
diff --git a/contrib/restricted/boost/context/src/execution_context.cpp b/contrib/restricted/boost/context/src/execution_context.cpp
deleted file mode 100644
index fc593ecb03..0000000000
--- a/contrib/restricted/boost/context/src/execution_context.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-
-// 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
diff --git a/contrib/restricted/boost/context/src/fiber.cpp b/contrib/restricted/boost/context/src/fiber.cpp
index 9bb4ba6e03..b6b790df54 100644
--- a/contrib/restricted/boost/context/src/fiber.cpp
+++ b/contrib/restricted/boost/context/src/fiber.cpp
@@ -21,20 +21,20 @@ namespace context {
namespace detail {
// zero-initialization
-thread_local fiber_activation_record * current_rec;
+thread_local fiber_activation_record * fib_current_rec;
thread_local static std::size_t counter;
// schwarz counter
fiber_activation_record_initializer::fiber_activation_record_initializer() noexcept {
if ( 0 == counter++) {
- current_rec = new fiber_activation_record();
+ fib_current_rec = new fiber_activation_record();
}
}
fiber_activation_record_initializer::~fiber_activation_record_initializer() {
if ( 0 == --counter) {
- BOOST_ASSERT( current_rec->is_main_context() );
- delete current_rec;
+ BOOST_ASSERT( fib_current_rec->is_main_context() );
+ delete fib_current_rec;
}
}
@@ -46,7 +46,7 @@ fiber_activation_record *&
fiber_activation_record::current() noexcept {
// initialized the first time control passes; per thread
thread_local static fiber_activation_record_initializer initializer;
- return current_rec;
+ return fib_current_rec;
}
}
diff --git a/contrib/restricted/boost/context/src/posix/stack_traits.cpp b/contrib/restricted/boost/context/src/posix/stack_traits.cpp
index ca42088855..4dd1829f70 100644
--- a/contrib/restricted/boost/context/src/posix/stack_traits.cpp
+++ b/contrib/restricted/boost/context/src/posix/stack_traits.cpp
@@ -20,11 +20,6 @@ extern "C" {
#include <boost/assert.hpp>
#include <boost/config.hpp>
-#if defined(BOOST_NO_CXX11_HDR_MUTEX)
-# include <boost/thread.hpp>
-#else
-# include <mutex>
-#endif
#if !defined (SIGSTKSZ)
# define SIGSTKSZ (32768) // 32kb minimum allowable stack
@@ -42,37 +37,20 @@ extern "C" {
namespace {
-void pagesize_( std::size_t * size) BOOST_NOEXCEPT_OR_NOTHROW {
+std::size_t pagesize() BOOST_NOEXCEPT_OR_NOTHROW {
// conform to POSIX.1-2001
- * size = ::sysconf( _SC_PAGESIZE);
+ return ::sysconf( _SC_PAGESIZE);
}
-void stacksize_limit_( rlimit * limit) BOOST_NOEXCEPT_OR_NOTHROW {
+rlim_t stacksize_limit_() BOOST_NOEXCEPT_OR_NOTHROW {
+ rlimit limit;
// conforming to POSIX.1-2001
- ::getrlimit( RLIMIT_STACK, limit);
+ ::getrlimit( RLIMIT_STACK, & limit);
+ return limit.rlim_max;
}
-std::size_t pagesize() BOOST_NOEXCEPT_OR_NOTHROW {
- static std::size_t size = 0;
-#if defined(BOOST_NO_CXX11_HDR_MUTEX)
- static boost::once_flag flag = BOOST_ONCE_INIT;
- boost::call_once( flag, pagesize_, & size);
-#else
- static std::once_flag flag;
- std::call_once( flag, pagesize_, & size);
-#endif
- return size;
-}
-
-rlimit stacksize_limit() BOOST_NOEXCEPT_OR_NOTHROW {
- static rlimit limit;
-#if defined(BOOST_NO_CXX11_HDR_MUTEX)
- static boost::once_flag flag = BOOST_ONCE_INIT;
- boost::call_once( flag, stacksize_limit_, & limit);
-#else
- static std::once_flag flag;
- std::call_once( flag, stacksize_limit_, & limit);
-#endif
+rlim_t stacksize_limit() BOOST_NOEXCEPT_OR_NOTHROW {
+ static rlim_t limit = stacksize_limit_();
return limit;
}
@@ -83,12 +61,13 @@ namespace context {
bool
stack_traits::is_unbounded() BOOST_NOEXCEPT_OR_NOTHROW {
- return RLIM_INFINITY == stacksize_limit().rlim_max;
+ return RLIM_INFINITY == stacksize_limit();
}
std::size_t
stack_traits::page_size() BOOST_NOEXCEPT_OR_NOTHROW {
- return pagesize();
+ static std::size_t size = pagesize();
+ return size;
}
std::size_t
@@ -104,7 +83,7 @@ stack_traits::minimum_size() BOOST_NOEXCEPT_OR_NOTHROW {
std::size_t
stack_traits::maximum_size() BOOST_NOEXCEPT_OR_NOTHROW {
BOOST_ASSERT( ! is_unbounded() );
- return static_cast< std::size_t >( stacksize_limit().rlim_max);
+ return static_cast< std::size_t >( stacksize_limit() );
}
}}
@@ -114,7 +93,7 @@ stack_traits::maximum_size() BOOST_NOEXCEPT_OR_NOTHROW {
#endif
#ifdef UDEF_SIGSTKSZ
-# undef SIGSTKSZ;
+# undef SIGSTKSZ
#endif
#ifdef UDEF_MINSIGSTKSZ
diff --git a/contrib/restricted/boost/mp11/CMakeLists.txt b/contrib/restricted/boost/mp11/CMakeLists.txt
new file mode 100644
index 0000000000..e4f3eec1c2
--- /dev/null
+++ b/contrib/restricted/boost/mp11/CMakeLists.txt
@@ -0,0 +1,18 @@
+
+# This file was gererated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+
+add_library(restricted-boost-mp11 INTERFACE)
+target_include_directories(restricted-boost-mp11 INTERFACE
+ ${CMAKE_SOURCE_DIR}/contrib/restricted/boost/mp11/include
+)
+target_link_libraries(restricted-boost-mp11 INTERFACE
+ contrib-libs-cxxsupp
+ yutil
+ restricted-boost-config
+)