String c_WaitableWaitHandle::getName() { switch (getKind()) { case Kind::Static: not_reached(); case Kind::AsyncFunction: return asAsyncFunction()->getName(); case Kind::AsyncGenerator: return asAsyncGenerator()->getName(); case Kind::AwaitAll: return asAwaitAll()->getName(); case Kind::GenArray: return asGenArray()->getName(); case Kind::GenMap: return asGenMap()->getName(); case Kind::GenVector: return asGenVector()->getName(); case Kind::Condition: return asCondition()->getName(); case Kind::Reschedule: return asReschedule()->getName(); case Kind::Sleep: return asSleep()->getName(); case Kind::ExternalThreadEvent: return asExternalThreadEvent()->getName(); } not_reached(); }
bool HHVM_FUNCTION(cancel, const Object& obj, const Object& exception) { if (!obj->instanceof(c_WaitHandle::classof())) { SystemLib::throwInvalidArgumentExceptionObject( "Cancellation unsupported for user-land Awaitable"); } auto handle = wait_handle<c_WaitHandle>(obj.get()); switch(handle->getKind()) { case c_WaitHandle::Kind::ExternalThreadEvent: return handle->asExternalThreadEvent()->cancel(exception); case c_WaitHandle::Kind::Sleep: return handle->asSleep()->cancel(exception); default: SystemLib::throwInvalidArgumentExceptionObject( "Cancellation unsupported for " + HHVM_MN(WaitHandle, getName) (handle) ); } }
void c_WaitableWaitHandle::enterContextImpl(context_idx_t ctx_idx) { switch (getKind()) { case Kind::Static: not_reached(); case Kind::AsyncFunction: return asAsyncFunction()->enterContextImpl(ctx_idx); case Kind::AsyncGenerator: return asAsyncGenerator()->enterContextImpl(ctx_idx); case Kind::GenArray: return asGenArray()->enterContextImpl(ctx_idx); case Kind::GenMap: return asGenMap()->enterContextImpl(ctx_idx); case Kind::GenVector: return asGenVector()->enterContextImpl(ctx_idx); case Kind::Reschedule: return asReschedule()->enterContextImpl(ctx_idx); case Kind::Sleep: return asSleep()->enterContextImpl(ctx_idx); case Kind::ExternalThreadEvent: return asExternalThreadEvent()->enterContextImpl(ctx_idx); } not_reached(); }