summaryrefslogtreecommitdiff
path: root/boost/fiber/future/detail
diff options
context:
space:
mode:
Diffstat (limited to 'boost/fiber/future/detail')
-rw-r--r--boost/fiber/future/detail/shared_state.hpp14
-rw-r--r--boost/fiber/future/detail/task_object.hpp13
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: