FutureState FutureBase::wait(qi::SteadyClock::time_point timepoint) const { boost::recursive_mutex::scoped_lock lock(_p->_mutex); if (_p->_state.load() != FutureState_Running) return FutureState(_p->_state.load()); _p->_cond.wait_until(lock, timepoint, boost::bind(&waitFinished, _p)); return FutureState(_p->_state.load()); }
FutureState FutureBase::wait(qi::Duration duration) const { boost::recursive_mutex::scoped_lock lock(_p->_mutex); if (_p->_state.load() != FutureState_Running) return FutureState(_p->_state.load()); _p->_cond.wait_for(lock, duration, boost::bind(&waitFinished, _p)); return FutureState(_p->_state.load()); }
FutureState FutureBase::wait(int msecs) const { boost::recursive_mutex::scoped_lock lock(_p->_mutex); if (_p->_state.load() != FutureState_Running) return FutureState(_p->_state.load()); if (msecs == FutureTimeout_Infinite) _p->_cond.wait(lock, boost::bind(&waitFinished, _p)); else if (msecs > 0) _p->_cond.wait_for(lock, qi::MilliSeconds(msecs), boost::bind(&waitFinished, _p)); // msecs <= 0 : do nothing just return the state return FutureState(_p->_state.load()); }
FutureState FutureBase::state() const { return FutureState(_p->_state.load()); }
bool FutureBase::isFinished() const { FutureState v = FutureState(_p->_state.load()); return v == FutureState_FinishedWithValue || v == FutureState_FinishedWithError || v == FutureState_Canceled; }
FutureState FutureBase::state() const { return FutureState(*_p->_state); }