diff options
Diffstat (limited to 'boost/fiber/future/detail')
-rw-r--r-- | boost/fiber/future/detail/shared_state.hpp | 14 | ||||
-rw-r--r-- | boost/fiber/future/detail/task_object.hpp | 13 |
2 files changed, 16 insertions, 11 deletions
diff --git a/boost/fiber/future/detail/shared_state.hpp b/boost/fiber/future/detail/shared_state.hpp index 898fdaffd4..28e0e3cfb9 100644 --- a/boost/fiber/future/detail/shared_state.hpp +++ b/boost/fiber/future/detail/shared_state.hpp @@ -62,7 +62,7 @@ protected: void set_exception_( std::exception_ptr except, std::unique_lock< mutex > & lk) { BOOST_ASSERT( lk.owns_lock() ); - if ( ready_) { + if ( BOOST_UNLIKELY( ready_) ) { throw promise_already_satisfied(); } except_ = except; @@ -161,19 +161,19 @@ private: void set_value_( R const& value, std::unique_lock< mutex > & lk) { BOOST_ASSERT( lk.owns_lock() ); - if ( ready_) { + if ( BOOST_UNLIKELY( ready_) ) { throw promise_already_satisfied{}; } - ::new ( static_cast< void * >( std::addressof( storage_) ) ) R{ value }; + ::new ( static_cast< void * >( std::addressof( storage_) ) ) R( value ); mark_ready_and_notify_( lk); } void set_value_( R && value, std::unique_lock< mutex > & lk) { BOOST_ASSERT( lk.owns_lock() ); - if ( ready_) { + if ( BOOST_UNLIKELY( ready_) ) { throw promise_already_satisfied{}; } - ::new ( static_cast< void * >( std::addressof( storage_) ) ) R{ std::move( value) }; + ::new ( static_cast< void * >( std::addressof( storage_) ) ) R( std::move( value) ); mark_ready_and_notify_( lk); } @@ -223,7 +223,7 @@ private: void set_value_( R & value, std::unique_lock< mutex > & lk) { BOOST_ASSERT( lk.owns_lock() ); - if ( ready_) { + if ( BOOST_UNLIKELY( ready_) ) { throw promise_already_satisfied(); } value_ = std::addressof( value); @@ -266,7 +266,7 @@ private: inline void set_value_( std::unique_lock< mutex > & lk) { BOOST_ASSERT( lk.owns_lock() ); - if ( ready_) { + if ( BOOST_UNLIKELY( ready_) ) { throw promise_already_satisfied(); } mark_ready_and_notify_( lk); diff --git a/boost/fiber/future/detail/task_object.hpp b/boost/fiber/future/detail/task_object.hpp index 3a48929a58..abb4c8d877 100644 --- a/boost/fiber/future/detail/task_object.hpp +++ b/boost/fiber/future/detail/task_object.hpp @@ -16,6 +16,7 @@ #if defined(BOOST_NO_CXX17_STD_APPLY) #include <boost/context/detail/apply.hpp> #endif +#include <boost/core/pointer_traits.hpp> #include <boost/fiber/detail/config.hpp> #include <boost/fiber/future/detail/task_base.hpp> @@ -68,15 +69,17 @@ public: typename base_type::ptr_type reset() override final { typedef std::allocator_traits< allocator_type > traity_type; + typedef pointer_traits< typename traity_type::pointer> ptrait_type; typename traity_type::pointer ptr{ traity_type::allocate( alloc_, 1) }; + typename ptrait_type::element_type* p = ptrait_type::to_address(ptr); try { - traity_type::construct( alloc_, ptr, alloc_, std::move( fn_) ); + traity_type::construct( alloc_, p, alloc_, std::move( fn_) ); } catch (...) { traity_type::deallocate( alloc_, ptr, 1); throw; } - return { convert( ptr) }; + return { p }; } protected: @@ -134,15 +137,17 @@ public: typename base_type::ptr_type reset() override final { typedef std::allocator_traits< allocator_type > traity_type; + typedef pointer_traits< typename traity_type::pointer> ptrait_type; typename traity_type::pointer ptr{ traity_type::allocate( alloc_, 1) }; + typename ptrait_type::element_type* p = ptrait_type::to_address(ptr); try { - traity_type::construct( alloc_, ptr, alloc_, std::move( fn_) ); + traity_type::construct( alloc_, p, alloc_, std::move( fn_) ); } catch (...) { traity_type::deallocate( alloc_, ptr, 1); throw; } - return { convert( ptr) }; + return { p }; } protected: |