summaryrefslogtreecommitdiff
path: root/boost/coroutine2/detail/push_coroutine.ipp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/coroutine2/detail/push_coroutine.ipp')
-rw-r--r--boost/coroutine2/detail/push_coroutine.ipp138
1 files changed, 41 insertions, 97 deletions
diff --git a/boost/coroutine2/detail/push_coroutine.ipp b/boost/coroutine2/detail/push_coroutine.ipp
index 5f4817802a..304e07729e 100644
--- a/boost/coroutine2/detail/push_coroutine.ipp
+++ b/boost/coroutine2/detail/push_coroutine.ipp
@@ -7,16 +7,14 @@
#ifndef BOOST_COROUTINES2_DETAIL_PUSH_COROUTINE_IPP
#define BOOST_COROUTINES2_DETAIL_PUSH_COROUTINE_IPP
-#include <memory>
#include <utility>
#include <boost/assert.hpp>
#include <boost/config.hpp>
-#include <boost/context/execution_context.hpp>
-#include <boost/context/stack_context.hpp>
-
#include <boost/coroutine2/detail/config.hpp>
+#include <boost/coroutine2/detail/create_control_block.ipp>
+#include <boost/coroutine2/detail/disable_overload.hpp>
#include <boost/coroutine2/fixedsize_stack.hpp>
#include <boost/coroutine2/segmented_stack.hpp>
@@ -31,52 +29,34 @@ namespace detail {
// push_coroutine< T >
template< typename T >
-push_coroutine< T >::push_coroutine( control_block * cb) :
- cb_( cb) {
+push_coroutine< T >::push_coroutine( control_block * cb) noexcept :
+ cb_{ cb } {
}
template< typename T >
-template< typename Fn >
-push_coroutine< T >::push_coroutine( Fn && fn, bool preserve_fpu) :
- push_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
+template< typename Fn,
+ typename
+>
+push_coroutine< T >::push_coroutine( Fn && fn) :
+ push_coroutine{ default_stack(), std::forward< Fn >( fn) } {
}
template< typename T >
template< typename StackAllocator, typename Fn >
-push_coroutine< T >::push_coroutine( StackAllocator salloc, Fn && fn, bool preserve_fpu) :
- cb_( nullptr) {
- context::stack_context sctx( salloc.allocate() );
- // reserve space for control structure
-#if defined(BOOST_NO_CXX14_CONSTEXPR) || defined(BOOST_NO_CXX11_STD_ALIGN)
- void * sp = static_cast< char * >( sctx.sp) - sizeof( control_block);
- std::size_t size = sctx.size - sizeof( control_block);
-#else
- constexpr std::size_t func_alignment = 64; // alignof( control_block);
- constexpr std::size_t func_size = sizeof( control_block);
- // 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
- std::size_t size = sctx.size - ( static_cast< char * >( sctx.sp) - static_cast< char * >( sp) );
-#endif
- // placment new for control structure on coroutine stack
- cb_= new ( sp) control_block( context::preallocated( sp, size, sctx),
- salloc, std::forward< Fn >( fn), preserve_fpu);
+push_coroutine< T >::push_coroutine( StackAllocator salloc, Fn && fn) :
+ cb_{ create_control_block< control_block >( salloc, std::forward< Fn >( fn) ) } {
}
template< typename T >
-push_coroutine< T >::~push_coroutine() {
+push_coroutine< T >::~push_coroutine() noexcept {
if ( nullptr != cb_) {
- cb_->~control_block();
+ cb_->deallocate();
}
}
template< typename T >
-push_coroutine< T >::push_coroutine( push_coroutine && other) :
- cb_( other.cb_) {
+push_coroutine< T >::push_coroutine( push_coroutine && other) noexcept :
+ cb_{ other.cb_ } {
other.cb_ = nullptr;
}
@@ -109,52 +89,34 @@ push_coroutine< T >::operator!() const noexcept {
// push_coroutine< T & >
template< typename T >
-push_coroutine< T & >::push_coroutine( control_block * cb) :
- cb_( cb) {
+push_coroutine< T & >::push_coroutine( control_block * cb) noexcept :
+ cb_{ cb } {
}
template< typename T >
-template< typename Fn >
-push_coroutine< T & >::push_coroutine( Fn && fn, bool preserve_fpu) :
- push_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
+template< typename Fn,
+ typename
+>
+push_coroutine< T & >::push_coroutine( Fn && fn) :
+ push_coroutine{ default_stack(), std::forward< Fn >( fn) } {
}
template< typename T >
template< typename StackAllocator, typename Fn >
-push_coroutine< T & >::push_coroutine( StackAllocator salloc, Fn && fn, bool preserve_fpu) :
- cb_( nullptr) {
- context::stack_context sctx( salloc.allocate() );
- // reserve space for control structure
-#if defined(BOOST_NO_CXX14_CONSTEXPR) || defined(BOOST_NO_CXX11_STD_ALIGN)
- void * sp = static_cast< char * >( sctx.sp) - sizeof( control_block);
- std::size_t size = sctx.size - sizeof( control_block);
-#else
- constexpr std::size_t func_alignment = 64; // alignof( control_block);
- constexpr std::size_t func_size = sizeof( control_block);
- // 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
- std::size_t size = sctx.size - ( static_cast< char * >( sctx.sp) - static_cast< char * >( sp) );
-#endif
- // placment new for control structure on coroutine stack
- cb_ = new ( sp) control_block( context::preallocated( sp, size, sctx),
- salloc, std::forward< Fn >( fn), preserve_fpu);
+push_coroutine< T & >::push_coroutine( StackAllocator salloc, Fn && fn) :
+ cb_{ create_control_block< control_block >( salloc, std::forward< Fn >( fn) ) } {
}
template< typename T >
-push_coroutine< T & >::~push_coroutine() {
+push_coroutine< T & >::~push_coroutine() noexcept {
if ( nullptr != cb_) {
- cb_->~control_block();
+ cb_->deallocate();
}
}
template< typename T >
-push_coroutine< T & >::push_coroutine( push_coroutine && other) :
- cb_( other.cb_) {
+push_coroutine< T & >::push_coroutine( push_coroutine && other) noexcept :
+ cb_{ other.cb_ } {
other.cb_ = nullptr;
}
@@ -180,50 +142,32 @@ push_coroutine< T & >::operator!() const noexcept {
// push_coroutine< void >
inline
-push_coroutine< void >::push_coroutine( control_block * cb) :
- cb_( cb) {
+push_coroutine< void >::push_coroutine( control_block * cb) noexcept :
+ cb_{ cb } {
}
-template< typename Fn >
-push_coroutine< void >::push_coroutine( Fn && fn, bool preserve_fpu) :
- push_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
+template< typename Fn,
+ typename
+>
+push_coroutine< void >::push_coroutine( Fn && fn) :
+ push_coroutine{ default_stack(), std::forward< Fn >( fn) } {
}
template< typename StackAllocator, typename Fn >
-push_coroutine< void >::push_coroutine( StackAllocator salloc, Fn && fn, bool preserve_fpu) :
- cb_( nullptr) {
- context::stack_context sctx( salloc.allocate() );
- // reserve space for control structure
-#if defined(BOOST_NO_CXX14_CONSTEXPR) || defined(BOOST_NO_CXX11_STD_ALIGN)
- void * sp = static_cast< char * >( sctx.sp) - sizeof( control_block);
- std::size_t size = sctx.size - sizeof( control_block);
-#else
- constexpr std::size_t func_alignment = 64; // alignof( control_block);
- constexpr std::size_t func_size = sizeof( control_block);
- // 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
- std::size_t size = sctx.size - ( static_cast< char * >( sctx.sp) - static_cast< char * >( sp) );
-#endif
- // placment new for control structure on coroutine stack
- cb_ = new ( sp) control_block( context::preallocated( sp, size, sctx),
- salloc, std::forward< Fn >( fn), preserve_fpu);
+push_coroutine< void >::push_coroutine( StackAllocator salloc, Fn && fn) :
+ cb_{ create_control_block< control_block >( salloc, std::forward< Fn >( fn) ) } {
}
inline
-push_coroutine< void >::~push_coroutine() {
+push_coroutine< void >::~push_coroutine() noexcept {
if ( nullptr != cb_) {
- cb_->~control_block();
+ cb_->deallocate();
}
}
inline
-push_coroutine< void >::push_coroutine( push_coroutine && other) :
- cb_( other.cb_) {
+push_coroutine< void >::push_coroutine( push_coroutine && other) noexcept :
+ cb_{ other.cb_ } {
other.cb_ = nullptr;
}