// Child is the AFWH we're going to block on, nullptr iff this is a suspending // generator. void EventHook::onFunctionSuspendR(ActRec* suspending, ObjectData* child) { ssize_t flags = CheckSurprise(); onFunctionExit(suspending, nullptr, nullptr, flags); if ((flags & RequestInjectionData::AsyncEventHookFlag) && suspending->func()->isAsyncFunction()) { assert(child != nullptr); // This isn't a generator assert(child->instanceof(c_WaitableWaitHandle::classof())); assert(suspending->resumed()); auto const afwh = frame_afwh(suspending); auto const session = AsioSession::Get(); if (session->hasOnResumableAwaitCallback()) { session->onResumableAwait( afwh, static_cast<c_WaitableWaitHandle*>(child) ); } } }
void EventHook::onFunctionSuspend(const ActRec* ar, bool suspendingResumed) { // TODO(#2329497) can't CheckSurprise() yet, unwinder frees suspended locals ssize_t flags = GetConditionFlags(); onFunctionExit(ar, nullptr, nullptr, flags); // Async profiler if ((flags & RequestInjectionData::AsyncEventHookFlag) && ar->func()->isAsyncFunction()) { assert(ar->resumed()); auto afwh = frame_afwh(ar); auto session = AsioSession::Get(); // Blocking await @ eager execution => AsyncFunctionWaitHandle created. if (!suspendingResumed && session->hasOnResumableCreateCallback()) { session->onResumableCreate(afwh, afwh->getChild()); } // Blocking await @ resumed execution => AsyncFunctionWaitHandle awaiting. if (suspendingResumed && session->hasOnResumableAwaitCallback()) { session->onResumableAwait(afwh, afwh->getChild()); } } }