summaryrefslogtreecommitdiff
path: root/boost/coroutine2/detail/pull_coroutine.ipp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/coroutine2/detail/pull_coroutine.ipp')
-rw-r--r--boost/coroutine2/detail/pull_coroutine.ipp158
1 files changed, 57 insertions, 101 deletions
diff --git a/boost/coroutine2/detail/pull_coroutine.ipp b/boost/coroutine2/detail/pull_coroutine.ipp
index 2e37ef2a98..58fe84575e 100644
--- a/boost/coroutine2/detail/pull_coroutine.ipp
+++ b/boost/coroutine2/detail/pull_coroutine.ipp
@@ -8,16 +8,14 @@
#define BOOST_COROUTINES2_DETAIL_PULL_COROUTINE_IPP
#include <algorithm>
-#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>
@@ -32,58 +30,44 @@ namespace detail {
// pull_coroutine< T >
template< typename T >
-pull_coroutine< T >::pull_coroutine( control_block * cb) :
- cb_( cb) {
+pull_coroutine< T >::pull_coroutine( control_block * cb) noexcept :
+ cb_{ cb } {
}
template< typename T >
bool
-pull_coroutine< T >::has_result_() const {
+pull_coroutine< T >::has_result_() const noexcept {
return nullptr != cb_->other->t;
}
template< typename T >
-template< typename Fn >
-pull_coroutine< T >::pull_coroutine( Fn && fn, bool preserve_fpu) :
- pull_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
+template< typename Fn,
+ typename
+>
+pull_coroutine< T >::pull_coroutine( Fn && fn) :
+ pull_coroutine{ default_stack(), std::forward< Fn >( fn) } {
}
template< typename T >
template< typename StackAllocator, typename Fn >
-pull_coroutine< T >::pull_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);
+pull_coroutine< T >::pull_coroutine( StackAllocator salloc, Fn && fn) :
+ cb_{ create_control_block< control_block >( salloc, std::forward< Fn >( fn) ) } {
+ if ( ! cb_->valid() ) {
+ cb_->deallocate();
+ cb_ = nullptr;
+ }
}
template< typename T >
-pull_coroutine< T >::~pull_coroutine() {
+pull_coroutine< T >::~pull_coroutine() noexcept {
if ( nullptr != cb_) {
- cb_->~control_block();
+ cb_->deallocate();
}
}
template< typename T >
-pull_coroutine< T >::pull_coroutine( pull_coroutine && other) :
- cb_( other.cb_) {
+pull_coroutine< T >::pull_coroutine( pull_coroutine && other) noexcept :
+ cb_{ other.cb_ } {
other.cb_ = nullptr;
}
@@ -107,7 +91,7 @@ pull_coroutine< T >::operator!() const noexcept {
template< typename T >
T
-pull_coroutine< T >::get() {
+pull_coroutine< T >::get() noexcept {
return std::move( cb_->get() );
}
@@ -115,58 +99,44 @@ pull_coroutine< T >::get() {
// pull_coroutine< T & >
template< typename T >
-pull_coroutine< T & >::pull_coroutine( control_block * cb) :
- cb_( cb) {
+pull_coroutine< T & >::pull_coroutine( control_block * cb) noexcept :
+ cb_{ cb } {
}
template< typename T >
bool
-pull_coroutine< T & >::has_result_() const {
+pull_coroutine< T & >::has_result_() const noexcept {
return nullptr != cb_->other->t;
}
template< typename T >
-template< typename Fn >
-pull_coroutine< T & >::pull_coroutine( Fn && fn, bool preserve_fpu) :
- pull_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
+template< typename Fn,
+ typename
+>
+pull_coroutine< T & >::pull_coroutine( Fn && fn) :
+ pull_coroutine{ default_stack(), std::forward< Fn >( fn) } {
}
template< typename T >
template< typename StackAllocator, typename Fn >
-pull_coroutine< T & >::pull_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);
+pull_coroutine< T & >::pull_coroutine( StackAllocator salloc, Fn && fn) :
+ cb_{ create_control_block< control_block >( salloc, std::forward< Fn >( fn) ) } {
+ if ( ! cb_->valid() ) {
+ cb_->deallocate();
+ cb_ = nullptr;
+ }
}
template< typename T >
-pull_coroutine< T & >::~pull_coroutine() {
+pull_coroutine< T & >::~pull_coroutine() noexcept {
if ( nullptr != cb_) {
- cb_->~control_block();
+ cb_->deallocate();
}
}
template< typename T >
-pull_coroutine< T & >::pull_coroutine( pull_coroutine && other) :
- cb_( other.cb_) {
+pull_coroutine< T & >::pull_coroutine( pull_coroutine && other) noexcept :
+ cb_{ other.cb_ } {
other.cb_ = nullptr;
}
@@ -190,7 +160,7 @@ pull_coroutine< T & >::operator!() const noexcept {
template< typename T >
T &
-pull_coroutine< T & >::get() {
+pull_coroutine< T & >::get() noexcept {
return cb_->get();
}
@@ -198,50 +168,36 @@ pull_coroutine< T & >::get() {
// pull_coroutine< void >
inline
-pull_coroutine< void >::pull_coroutine( control_block * cb) :
- cb_( cb) {
+pull_coroutine< void >::pull_coroutine( control_block * cb) noexcept :
+ cb_{ cb } {
}
-template< typename Fn >
-pull_coroutine< void >::pull_coroutine( Fn && fn, bool preserve_fpu) :
- pull_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
+template< typename Fn,
+ typename
+>
+pull_coroutine< void >::pull_coroutine( Fn && fn) :
+ pull_coroutine{ default_stack(), std::forward< Fn >( fn) } {
}
template< typename StackAllocator, typename Fn >
-pull_coroutine< void >::pull_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);
+pull_coroutine< void >::pull_coroutine( StackAllocator salloc, Fn && fn) :
+ cb_{ create_control_block< control_block >( salloc, std::forward< Fn >( fn) ) } {
+ if ( ! cb_->valid() ) {
+ cb_->deallocate();
+ cb_ = nullptr;
+ }
}
inline
-pull_coroutine< void >::~pull_coroutine() {
+pull_coroutine< void >::~pull_coroutine() noexcept {
if ( nullptr != cb_) {
- cb_->~control_block();
+ cb_->deallocate();
}
}
inline
-pull_coroutine< void >::pull_coroutine( pull_coroutine && other) :
- cb_( other.cb_) {
+pull_coroutine< void >::pull_coroutine( pull_coroutine && other) noexcept :
+ cb_{ other.cb_ } {
other.cb_ = nullptr;
}