예제 #1
0
Object c_AwaitAllWaitHandle::FromMap(const BaseMap* dependencies) {
  auto const start = dependencies->firstElm();
  auto const stop = dependencies->elmLimit();
  int32_t cnt = 0;

  for (auto iter = start; iter != stop; iter = BaseMap::nextElm(iter, stop)) {
    auto const current = tvAssertCell(&iter->data);
    auto const child = c_WaitHandle::fromCell(current);
    if (UNLIKELY(!child)) failMap();
    cnt += !child->isFinished();
  }

  if (!cnt) return returnEmpty();

  SmartPtr<c_AwaitAllWaitHandle> result(Alloc(cnt));
  auto next = &result->m_children[cnt];

  for (auto iter = start; iter != stop; iter = BaseMap::nextElm(iter, stop)) {
    auto const current = tvAssertCell(&iter->data);
    auto const child = c_WaitHandle::fromCell(current);
    if (child->isFinished()) continue;
    child->incRefCount();
    *(--next) = static_cast<c_WaitableWaitHandle*>(child);
  }

  assert(next == &result->m_children[0]);
  result->initialize();
  return Object(std::move(result));
}
예제 #2
0
Object c_AwaitAllWaitHandle::ti_frommap(const Variant& dependencies) {
  if (LIKELY(dependencies.isObject())) {
    auto obj = dependencies.getObjectData();
    if (LIKELY(obj->isCollection() && isMapCollection(obj->collectionType()))) {
      assertx(collections::isType(obj->getVMClass(), CollectionType::Map,
                                                     CollectionType::ImmMap));
      return FromMap(static_cast<BaseMap*>(obj));
    }
  }
  failMap();
}
Object c_AwaitAllWaitHandle::ti_frommap(const Variant& dependencies) {
  if (LIKELY(dependencies.isObject())) {
    auto obj = dependencies.getObjectData();
    if (LIKELY(obj->isCollection() && isMapCollection(obj->collectionType()))) {
      assert(obj->instanceof(c_Map::classof()) ||
             obj->instanceof(c_ImmMap::classof()));
      return FromMap(static_cast<BaseMap*>(obj));
    }
  }
  failMap();
}
예제 #4
0
Object c_AwaitAllWaitHandle::ti_frommap(const Variant& dependencies) {
  if (UNLIKELY(!dependencies.isObject() ||
               !Collection::isMapType(
                 dependencies.getObjectData()->getCollectionType()))) {
    failMap();
  }
  assert(
    dependencies.getObjectData()->instanceof(c_Map::classof()) ||
    dependencies.getObjectData()->instanceof(c_ImmMap::classof())
  );

  return FromMap(static_cast<BaseMap*>(dependencies.getObjectData()));
}
예제 #5
0
Object HHVM_STATIC_METHOD(AwaitAllWaitHandle, fromMap,
                          const Variant& dependencies) {
  if (LIKELY(dependencies.isObject())) {
    auto obj = dependencies.getObjectData();
    if (LIKELY(obj->isCollection() && isMapCollection(obj->collectionType()))) {
      assertx(collections::isType(obj->getVMClass(), CollectionType::Map,
                                                     CollectionType::ImmMap));
      return c_AwaitAllWaitHandle::Create<false>([=](auto fn) {
        MixedArray::IterateV(static_cast<BaseMap*>(obj)->arrayData(), fn);
      });
    }
  }
  failMap();
}