void c_ExternalThreadEventWaitHandle::process() { assert(getState() == STATE_WAITING); if (isInContext()) { unregisterFromContext(); } // clean up once event is processed auto exit_guard = folly::makeGuard([&] { destroyEvent(); }); Cell result; try { m_event->unserialize(result); } catch (const Object& exception) { setException(exception.get()); return; } catch (...) { setException(AsioSession::Get()->getAbruptInterruptException().get()); throw; } assert(cellIsPlausible(result)); setResult(result); tvRefcountedDecRefCell(&result); }
c_WaitableWaitHandle::~c_WaitableWaitHandle() { switch (getState()) { case STATE_SUCCEEDED: tvRefcountedDecRefCell(&m_resultOrException); break; case STATE_FAILED: tvDecRefObj(&m_resultOrException); break; } }
c_WaitableWaitHandle::~c_WaitableWaitHandle() { switch (getState()) { case STATE_SUCCEEDED: tvRefcountedDecRefCell(&m_resultOrException); break; case STATE_FAILED: tvDecRefObj(&m_resultOrException); break; } // unref creator if (m_creator) { decRefObj(m_creator); m_creator = nullptr; } }
void c_ExternalThreadEventWaitHandle::process() { assert(getState() == STATE_WAITING); if (isInContext()) { getContext()->unregisterExternalThreadEvent(m_index); } try { TypedValue result; m_event->unserialize(&result); assert(tvIsPlausible(&result)); setResult(&result); tvRefcountedDecRefCell(&result); } catch (const Object& exception) { setException(exception.get()); } // event is processed, destroy it, unregister sweepable and decref ownership m_event->release(); m_event = nullptr; m_privData = nullptr; unregister(); decRefObj(this); }
c_StaticResultWaitHandle::~c_StaticResultWaitHandle() { tvRefcountedDecRefCell(&m_resultOrException); }