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();
}
Ejemplo n.º 3
0
void NetworkInterfaceASIO::signalWorkAvailable() {
    stdx::unique_lock<stdx::mutex> lk(_executorMutex);
    _signalWorkAvailable_inlock();
}
void NetworkInterfaceImpl::signalWorkAvailable() {
    stdx::lock_guard<stdx::mutex> lk(_mutex);
    _signalWorkAvailable_inlock();
}