예제 #1
0
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();
}
예제 #2
0
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)
      );
  }
}
예제 #3
0
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();
}