11 #ifdef FC_TASK_NAMES_ARE_MANDATORY 12 # define FC_TASK_NAME_DEFAULT_ARG 14 # define FC_TASK_NAME_DEFAULT_ARG = "?" 18 #ifdef FC_CANCELATION_REASONS_ARE_MANDATORY 19 # define FC_CANCELATION_REASON_DEFAULT_ARG 21 # define FC_CANCELATION_REASON_DEFAULT_ARG = nullptr 36 template<
typename Functor,
typename T>
43 _func( *static_cast<const T*>(v), e);
48 template<
typename Functor>
61 class promise_base :
public std::enable_shared_from_this<promise_base> {
63 typedef std::shared_ptr<promise_base>
ptr;
66 const char* get_desc()
const;
79 void _wait_until(
const time_point& timeout_us );
81 void _set_value(
const void* v);
86 void _enqueue_thread();
87 void _dequeue_thread();
93 std::atomic<bool> _ready;
94 std::atomic<thread*> _blocked_thread;
95 std::atomic<int32_t> _blocked_fiber_count;
105 std::atomic<detail::completion_handler*> _compl;
108 template<
typename T =
void>
111 typedef std::shared_ptr< promise<T> >
ptr;
124 return ptr(
new promise<T>( std::move(val) ) );
128 this->_wait( timeout );
132 this->_wait_until( tp );
138 _set_value(&*result);
142 result = std::move(v);
143 _set_value(&*result);
146 template<
typename CompletionHandler>
153 promise( T&& val ){ set_value(std::move(val) ); }
161 typedef std::shared_ptr< promise<void> >
ptr;
175 this->_wait( timeout );
178 this->_wait_until( tp );
184 template<
typename CompletionHandler>
191 if( fulfilled ) set_value();
219 std::swap(m_prom,f.m_prom);
223 operator const T&()
const {
return wait(); }
229 return m_prom->wait(timeout);
237 return m_prom->wait_until(tp);
240 bool valid()
const {
return !!m_prom; }
243 bool ready()
const {
return m_prom->ready(); }
246 bool error()
const {
return m_prom->error(); }
249 bool canceled()
const {
if( m_prom )
return m_prom->canceled();
else return true;}
260 catch (
const canceled_exception&)
273 template<
typename CompletionHandler>
275 m_prom->on_complete( std::forward<CompletionHandler>(c) );
291 std::swap(m_prom,f.m_prom);
301 m_prom->wait(timeout);
308 m_prom->wait_until(tp);
311 bool valid()
const {
return !!m_prom; }
312 bool canceled()
const {
return m_prom ? m_prom->canceled() :
true; }
321 catch (
const canceled_exception&)
327 bool ready()
const {
return m_prom->ready(); }
330 bool error()
const {
return m_prom->error(); }
334 template<
typename CompletionHandler>
336 m_prom->on_complete( std::forward<CompletionHandler>(c) );
void on_complete(CompletionHandler &&c)
static ptr create(const char *desc FC_TASK_NAME_DEFAULT_ARG)
a placeholder for the result of an asynchronous operation.
completion_handler_impl(Functor &&f)
#define FC_CANCELATION_REASON_DEFAULT_ARG
virtual ~completion_handler()
T wait(boost::signals2::signal< void(T)> &sig, const microseconds &timeout_us=microseconds::maximum())
void on_complete(CompletionHandler &&c)
const char * _cancellation_reason
static ptr create(const T &val)
std::shared_ptr< promise_base > ptr
void wait_until(const time_point &tp)
const T & wait_until(const time_point &tp) const
void cancel(const char *reason FC_CANCELATION_REASON_DEFAULT_ARG) const
future(typename promise< void >::ptr &&p)
void cancel(const char *reason FC_CANCELATION_REASON_DEFAULT_ARG) const
virtual void on_complete(const void *v, const fc::exception_ptr &e)
const T & wait_until(const time_point &tp)
const T & wait(const microseconds &timeout=microseconds::maximum()) const
promise(bool fulfilled, const char *desc)
promise(const char *desc)
void wait(const microseconds &timeout=microseconds::maximum())
future(typename promise< T >::ptr &&p)
provides stack-based nullable value similar to boost::optional
std::shared_ptr< exception > exception_ptr
future & operator=(future< void > &&f)
void cancel_and_wait(const char *reason FC_CANCELATION_REASON_DEFAULT_ARG)
const T & wait(const microseconds &timeout=microseconds::maximum())
completion_handler_impl(const Functor &f)
static ptr create(bool fulfilled, const char *desc FC_TASK_NAME_DEFAULT_ARG)
future & operator=(future< T > &&f)
void cancel_and_wait(const char *reason FC_CANCELATION_REASON_DEFAULT_ARG)
void set_value(const void_t &)
static ptr create(T &&val)
void set_value(const T &v)
void on_complete(CompletionHandler &&c)
#define FC_TASK_NAME_DEFAULT_ARG
future(const future< T > &f)
Defines exception's used by fc.
future(const typename promise< T >::ptr &p)
completion_handler_impl(const Functor &f)
void wait(const microseconds &timeout=microseconds::maximum())
void wait_until(const time_point &tp)
promise(const char *desc)
completion_handler_impl(Functor &&f)
virtual void on_complete(const void *v, const fc::exception_ptr &e)
future(const typename promise< void >::ptr &p)
std::shared_ptr< promise< void > > ptr
static microseconds maximum()
future(const future< void > &f)
static ptr create(const char *desc FC_TASK_NAME_DEFAULT_ARG)
void on_complete(CompletionHandler &&c)
std::shared_ptr< promise< T > > ptr