/** * Waits until the specified timeout in milliseconds for the condition to * occur, or waits forever if timeout_ms == 0. * * Returns 0 if condition occurs, THRIFT_ETIMEDOUT on timeout, or an error code. */ int waitForTimeRelative(int64_t timeout_ms) { if (timeout_ms == 0LL) { return waitForever(); } assert(mutex_); boost::timed_mutex* mutexImpl = reinterpret_cast<boost::timed_mutex*>(mutex_->getUnderlyingImpl()); assert(mutexImpl); boost::timed_mutex::scoped_lock lock(*mutexImpl, boost::adopt_lock); int res = timed_wait(lock, boost::get_system_time()+boost::posix_time::milliseconds(timeout_ms)) ? 0 : THRIFT_ETIMEDOUT; lock.release(); return res; }
/** * Waits until the specified timeout in milliseconds for the condition to * occur, or waits forever if timeout_ms == 0. * * Returns 0 if condition occurs, THRIFT_ETIMEDOUT on timeout, or an error code. */ int waitForTimeRelative(int64_t timeout_ms) { if (timeout_ms == 0LL) { return waitForever(); } assert(mutex_); std::timed_mutex* mutexImpl = static_cast<std::timed_mutex*>(mutex_->getUnderlyingImpl()); assert(mutexImpl); std::unique_lock<std::timed_mutex> lock(*mutexImpl, std::adopt_lock); bool timedout = (conditionVariable_.wait_for(lock, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout); lock.release(); return (timedout ? THRIFT_ETIMEDOUT : 0); }