LockResult CondVarLockGrantNotification::wait(Milliseconds timeout) { stdx::unique_lock<stdx::mutex> lock(_mutex); return _cond.wait_for( lock, timeout.toSystemDuration(), [this] { return _result != LOCK_INVALID; }) ? _result : LOCK_TIMEOUT; }
void NetworkInterfaceASIO::waitForWorkUntil(Date_t when) { stdx::unique_lock<stdx::mutex> lk(_executorMutex); // TODO: This can be restructured with a lambda. while (!_isExecutorRunnable) { const Milliseconds waitTime(when - now()); if (waitTime <= Milliseconds(0)) { break; } _isExecutorRunnableCondition.wait_for(lk, waitTime.toSystemDuration()); } _isExecutorRunnable = false; }
Status ServiceExecutorReserved::shutdown(Milliseconds timeout) { LOG(3) << "Shutting down reserved executor"; stdx::unique_lock<stdx::mutex> lock(_mutex); _stillRunning.store(false); _threadWakeup.notify_all(); bool result = _shutdownCondition.wait_for(lock, timeout.toSystemDuration(), [this]() { return _numRunningWorkerThreads.load() == 0; }); return result ? Status::OK() : Status(ErrorCodes::Error::ExceededTimeLimit, "reserved executor couldn't shutdown all worker threads within time limit."); }
AsyncTimerASIO::AsyncTimerASIO(asio::io_service::strand* strand, Milliseconds expiration) : _strand(strand), _timer(_strand->get_io_service(), expiration.toSystemDuration()) {}