void ThreadPoolTaskExecutor::waitForEvent(const EventHandle& event) { invariant(event.isValid()); auto eventState = checked_cast<EventState*>(getEventFromHandle(event)); stdx::unique_lock<stdx::mutex> lk(_mutex); while (!eventState->isSignaledFlag) { eventState->isSignaledCondition.wait(lk); } }
void ThreadPoolTaskExecutor::signalEvent_inlock(const EventHandle& event) { invariant(event.isValid()); auto eventState = checked_cast<EventState*>(getEventFromHandle(event)); invariant(!eventState->isSignaledFlag); eventState->isSignaledFlag = true; eventState->isSignaledCondition.notify_all(); scheduleIntoPool_inlock(&eventState->waiters); _unsignaledEvents.erase(eventState->iter); }
StatusWith<TaskExecutor::CallbackHandle> ThreadPoolTaskExecutor::onEvent(const EventHandle& event, const CallbackFn& work) { stdx::lock_guard<stdx::mutex> lk(_mutex); if (!event.isValid()) { return {ErrorCodes::BadValue, "Passed invalid event handle to onEvent"}; } auto eventState = checked_cast<EventState*>(getEventFromHandle(event)); auto cbHandle = enqueueCallbackState_inlock(&eventState->waiters, work); if (!cbHandle.isOK()) { return cbHandle; } if (eventState->isSignaledFlag) { scheduleIntoPool_inlock(&eventState->waiters); } return cbHandle; }
void TaskExecutor::waitForEvent(const EventHandle& event) { getEventFromHandle(event)->waitUntilSignaled(); }
void TaskExecutor::signalEvent(const EventHandle& event) { getEventFromHandle(event)->signal(); }