示例#1
0
APCHandle::Pair APCArray::MakeHash(ArrayData* arr, bool unserializeObj) {
  auto num = arr->size();
  auto cap = num > 2 ? folly::nextPowTwo(num) : 2;

  auto size = sizeof(APCArray) + sizeof(int) * cap + sizeof(Bucket) * num;
  auto p = malloc(size);
  APCArray* ret = new (p) APCArray(static_cast<unsigned int>(cap));

  for (int i = 0; i < cap; i++) ret->hash()[i] = -1;

  try {
    for (ArrayIter it(arr); !it.end(); it.next()) {
      auto key = APCHandle::Create(it.first(), false, APCHandleLevel::Inner,
                                   unserializeObj);
      size += key.size;
      auto val = APCHandle::Create(it.secondRef(), false,
                                   APCHandleLevel::Inner, unserializeObj);
      size += val.size;
      ret->add(key.handle, val.handle);
    }
  } catch (...) {
    delete ret;
    throw;
  }

  return {ret->getHandle(), size};
}
示例#2
0
APCHandle* APCArray::MakeShared(ArrayData* arr,
                                size_t& size,
                                bool unserializeObj) {
  auto num = arr->size();
  auto cap = num > 2 ? folly::nextPowTwo(num) : 2;

  size = sizeof(APCArray) + sizeof(int) * cap + sizeof(Bucket) * num;
  void* p = malloc(size);
  APCArray* ret = new (p) APCArray(static_cast<unsigned int>(cap));

  for (int i = 0; i < cap; i++) ret->hash()[i] = -1;

  try {
    for (ArrayIter it(arr); !it.end(); it.next()) {
      size_t s = 0;
      auto key = APCHandle::Create(it.first(), s, false, true,
                                   unserializeObj);
      size += s;
      s = 0;
      auto val = APCHandle::Create(it.secondRef(), s, false, true,
                                   unserializeObj);
      size += s;
      ret->add(key, val);
    }
  } catch (...) {
    delete ret;
    throw;
  }

  return ret->getHandle();
}
示例#3
0
APCHandle::Pair APCArray::MakeSharedEmptyArray() {
  void* p = malloc(sizeof(APCArray));
  APCArray* arr = new (p) APCArray(static_cast<size_t>(0));
  return {arr->getHandle(), sizeof(APCArray)};
}
示例#4
0
APCHandle* APCArray::MakeShared() {
  void* p = malloc(sizeof(APCArray));
  APCArray* arr = new (p) APCArray(static_cast<size_t>(0));
  return arr->getHandle();
}