diff options
Diffstat (limited to 'boost/coroutine2/detail/pull_coroutine.ipp')
-rw-r--r-- | boost/coroutine2/detail/pull_coroutine.ipp | 158 |
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; } |