void c_SleepWaitHandle::process() { assert(getState() == STATE_WAITING); if (isInContext()) { unregisterFromContext(); } auto parentChain = getParentChain(); setState(STATE_SUCCEEDED); tvWriteNull(&m_resultOrException); parentChain.unblock(); auto session = AsioSession::Get(); if (UNLIKELY(session->hasOnSleepSuccess())) { session->onSleepSuccess(this); } }
bool c_SleepWaitHandle::cancel(const Object& exception) { if (getState() != STATE_WAITING) { return false; // already finished } if (isInContext()) { unregisterFromContext(); } auto parentChain = getParentChain(); setState(STATE_FAILED); tvWriteObject(exception.get(), &m_resultOrException); parentChain.unblock(); // this is technically a lie, since sleep failed auto session = AsioSession::Get(); if (UNLIKELY(session->hasOnSleepSuccess())) { session->onSleepSuccess(this); } return true; }
bool c_SleepWaitHandle::process() { if (getState() == STATE_FAILED) { // sleep handle was cancelled, everything is taken care of return false; } assert(getState() == STATE_WAITING); if (isInContext()) { unregisterFromContext(); } auto parentChain = getParentChain(); setState(STATE_SUCCEEDED); tvWriteNull(&m_resultOrException); parentChain.unblock(); auto session = AsioSession::Get(); if (UNLIKELY(session->hasOnSleepSuccess())) { session->onSleepSuccess(this); } return true; }