void c_AsyncFunctionWaitHandle::ret(Cell& result) { auto const parentChain = getFirstParent(); setState(STATE_SUCCEEDED); cellCopy(result, m_resultOrException); UnblockChain(parentChain); decRefObj(this); }
/** * Mark the wait handle as failed due to unexpected abrupt interrupt. */ void c_AsyncFunctionWaitHandle::failCpp() { assert(isRunning()); auto const exception = AsioSession::Get()->getAbruptInterruptException(); auto const parentChain = getFirstParent(); setState(STATE_FAILED); tvWriteObject(exception, &m_resultOrException); UnblockChain(parentChain); decRefObj(this); }
void c_AsyncFunctionWaitHandle::fail(ObjectData* exception) { AsioSession* session = AsioSession::Get(); if (UNLIKELY(session->hasOnAsyncFunctionFailCallback())) { session->onAsyncFunctionFail(this, exception); } auto const parentChain = getFirstParent(); setState(STATE_FAILED); tvWriteObject(exception, &m_resultOrException); UnblockChain(parentChain); decRefObj(this); }
void c_GenMapWaitHandle::onUnblocked() { assert(getState() == STATE_BLOCKED); for (; m_deps->iter_valid(m_iterPos); m_iterPos = m_deps->iter_next(m_iterPos)) { auto* current = tvAssertCell(m_deps->iter_value(m_iterPos)); assert(current->m_type == KindOfObject); assert(current->m_data.pobj->instanceof(c_WaitHandle::classof())); auto child = static_cast<c_WaitHandle*>(current->m_data.pobj); if (child->isSucceeded()) { auto k = m_deps->iter_key(m_iterPos); m_deps->set(k.asCell(), &child->getResult()); } else if (child->isFailed()) { putException(m_exception, child->getException()); } else { assert(child->instanceof(c_WaitHandle::classof())); auto child_wh = static_cast<c_WaitableWaitHandle*>(child); try { if (isInContext()) { child_wh->enterContext(getContextIdx()); } detectCycle(child_wh); blockOn(child_wh); return; } catch (const Object& cycle_exception) { putException(m_exception, cycle_exception.get()); } } } auto const parentChain = getFirstParent(); if (m_exception.isNull()) { setState(STATE_SUCCEEDED); tvWriteObject(m_deps.get(), &m_resultOrException); } else { setState(STATE_FAILED); tvWriteObject(m_exception.get(), &m_resultOrException); m_exception = nullptr; } m_deps = nullptr; UnblockChain(parentChain); decRefObj(this); }
/** * Mark the wait handle as failed due to PHP exception. * * - consumes reference of the given Exception object */ void c_AsyncFunctionWaitHandle::fail(ObjectData* exception) { assert(isRunning()); assert(exception); assert(exception->instanceof(SystemLib::s_ExceptionClass)); AsioSession* session = AsioSession::Get(); if (UNLIKELY(session->hasOnResumableFailCallback())) { session->onResumableFail(this, exception); } auto const parentChain = getFirstParent(); setState(STATE_FAILED); cellCopy(make_tv<KindOfObject>(exception), m_resultOrException); UnblockChain(parentChain); decRefObj(this); }