void NetworkInterfaceImpl::_runOneCommand() { stdx::unique_lock<stdx::mutex> lk(_mutex); if (_pending.empty()) { // This may happen if any commands were canceled. return; } CommandData todo = _pending.front(); _pending.pop_front(); ++_numActiveNetworkRequests; lk.unlock(); TaskExecutor::ResponseStatus result = _commandRunner.runCommand(todo.request); LOG(2) << "Network status of sending " << todo.request.cmdObj.firstElementFieldName() << " to " << todo.request.target << " was " << result.getStatus(); todo.onFinish(result); lk.lock(); --_numActiveNetworkRequests; _signalWorkAvailable_inlock(); }
void NetworkInterfaceImpl::cancelCommand(const TaskExecutor::CallbackHandle& cbHandle) { stdx::unique_lock<stdx::mutex> lk(_mutex); CommandDataList::iterator iter; for (iter = _pending.begin(); iter != _pending.end(); ++iter) { if (iter->cbHandle == cbHandle) { break; } } if (iter == _pending.end()) { return; } const RemoteCommandCompletionFn onFinish = iter->onFinish; LOG(2) << "Canceled sending " << iter->request.cmdObj.firstElementFieldName() << " to " << iter->request.target; _pending.erase(iter); lk.unlock(); onFinish(TaskExecutor::ResponseStatus(ErrorCodes::CallbackCanceled, "Callback canceled")); lk.lock(); _signalWorkAvailable_inlock(); }
void NetworkInterfaceASIO::signalWorkAvailable() { stdx::unique_lock<stdx::mutex> lk(_executorMutex); _signalWorkAvailable_inlock(); }
void NetworkInterfaceImpl::signalWorkAvailable() { stdx::lock_guard<stdx::mutex> lk(_mutex); _signalWorkAvailable_inlock(); }