void c_ExternalThreadEventWaitHandle::enterContextImpl(context_idx_t ctx_idx) { assert(getState() == STATE_WAITING); if (isInContext()) { unregisterFromContext(); } setContextIdx(ctx_idx); registerToContext(); }
void c_SessionScopedWaitHandle::enterContextImpl(context_idx_t ctx_idx) { assert(getState() == STATE_WAITING); if (isInContext()) { unregisterFromContext(); } setContextIdx(ctx_idx); registerToContext(); }
void c_ExternalThreadEventWaitHandle::initialize(AsioExternalThreadEvent* event, ObjectData* priv_data) { // this wait handle is owned by existence of unprocessed event incRefCount(); m_event = event; m_privData = priv_data; setState(STATE_WAITING); if (isInContext()) { registerToContext(); } }
void c_SleepWaitHandle::initialize(int64_t usecs) { m_waketime = AsioSession::TimePoint::clock::now() + std::chrono::microseconds(usecs); incRefCount(); AsioSession::Get()->getSleepEventQueue().push(this); setState(STATE_WAITING); if (isInContext()) { registerToContext(); } }
void c_SleepWaitHandle::exitContext(context_idx_t ctx_idx) { assert(AsioSession::Get()->getContext(ctx_idx)); assert(getState() == STATE_WAITING); assert(getContextIdx() == ctx_idx); // Move us to the parent context. setContextIdx(getContextIdx() - 1); // Re-register if still in a context. if (isInContext()) { registerToContext(); } // Recursively move all wait handles blocked by us. getParentChain().exitContext(ctx_idx); }
void c_ExternalThreadEventWaitHandle::initialize(AsioExternalThreadEvent* event, ObjectData* priv_data) { setState(STATE_WAITING); m_event = event; m_privData = priv_data; // this wait handle is owned by existence of unprocessed event incRefCount(); if (isInContext()) { registerToContext(); } auto session = AsioSession::Get(); if (UNLIKELY(session->hasOnExternalThreadEventCreateCallback())) { session->onExternalThreadEventCreate(this); } }
void c_ExternalThreadEventWaitHandle::exitContext(context_idx_t ctx_idx) { assert(AsioSession::Get()->getContext(ctx_idx)); assert(getContextIdx() == ctx_idx); assert(getState() == STATE_WAITING); // Move us to the parent context. setContextIdx(getContextIdx() - 1); // Re-register if still in a context. if (isInContext()) { registerToContext(); } // Recursively move all wait handles blocked by us. for (auto pwh = getFirstParent(); pwh; pwh = pwh->getNextParent()) { pwh->exitContextBlocked(ctx_idx); } }
void c_ExternalThreadEventWaitHandle::initialize( AsioExternalThreadEvent* event, ObjectData* priv_data ) { auto const session = AsioSession::Get(); setState(STATE_WAITING); setContextIdx(session->getCurrentContextIdx()); m_event = event; m_privData = priv_data; if (isInContext()) { registerToContext(); } if (UNLIKELY(session->hasOnExternalThreadEventCreate())) { session->onExternalThreadEventCreate(this); } }
void c_SleepWaitHandle::initialize(int64_t usecs) { auto const session = AsioSession::Get(); setState(STATE_WAITING); setContextIdx(session->getCurrentContextIdx()); m_waketime = AsioSession::TimePoint::clock::now() + std::chrono::microseconds(usecs); incRefCount(); session->enqueueSleepEvent(this); if (isInContext()) { registerToContext(); } if (UNLIKELY(session->hasOnSleepCreate())) { session->onSleepCreate(this); } }