Esempio n. 1
0
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);
    }
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
 void TaskExecutor::waitForEvent(const EventHandle& event) {
     getEventFromHandle(event)->waitUntilSignaled();
 }
Esempio n. 5
0
 void TaskExecutor::signalEvent(const EventHandle& event) {
     getEventFromHandle(event)->signal();
 }