inline void exitContextImpl( c_AwaitAllWaitHandle::Node* node, context_idx_t ctx_idx ) { if (node->isFirstUnfinishedChild()) { exitContextImpl(node->getWaitHandle(), ctx_idx); } }
void AsioBlockableChain::exitContext(context_idx_t ctx_idx) { for (auto cur = m_firstParent; cur; cur = cur->getNextParent()) { switch (cur->getKind()) { case Kind::AsyncFunctionWaitHandleNode: exitContextImpl(getAsyncFunctionWaitHandleNode(cur), ctx_idx); break; case Kind::AsyncGeneratorWaitHandle: exitContextImpl(getAsyncGeneratorWaitHandle(cur), ctx_idx); break; case Kind::AwaitAllWaitHandle: exitContextImpl(getAwaitAllWaitHandle(cur), ctx_idx); break; case Kind::ConditionWaitHandle: exitContextImpl(getConditionWaitHandle(cur), ctx_idx); break; case Kind::GenArrayWaitHandle: exitContextImpl(getGenArrayWaitHandle(cur), ctx_idx); break; case Kind::GenMapWaitHandle: exitContextImpl(getGenMapWaitHandle(cur), ctx_idx); break; case Kind::GenVectorWaitHandle: exitContextImpl(getGenVectorWaitHandle(cur), ctx_idx); break; } } }
inline void exitContextImpl( c_ConditionWaitHandle* waitHandle, context_idx_t ctx_idx ) { // ConditionWaitHandle may finish before its children do. if (waitHandle->isFinished()) { return; } exitContextImpl(static_cast<c_WaitableWaitHandle*>(waitHandle), ctx_idx); }