ExportedStatMap::StatPtr ExportedStatMap::getStatPtrNoExport()

in fb303/ExportedStatMap.cpp [53:89]


ExportedStatMap::StatPtr ExportedStatMap::getStatPtrNoExport(
    StringPiece name,
    bool* createdPtr,
    const ExportedStat* copyMe) {
  if (createdPtr) {
    *createdPtr = false;
  }

  {
    auto rlock = statMap_.rlock();
    auto iter = rlock->find(name);
    if (iter != rlock->end()) {
      return iter->second;
    }
  }

  auto ulock = statMap_.ulock();
  auto iter = ulock->find(name);
  if (iter != ulock->end()) {
    // Stat was populated before we acquired the ulock.
    return iter->second;
  }

  auto value = std::make_shared<SyncStat>(defaultStat_);
  if (copyMe) {
    *value = *copyMe;
  }

  if (createdPtr) {
    *createdPtr = true;
  }

  auto wlock = ulock.moveFromUpgradeToWrite();
  auto item = wlock->try_emplace(name, std::move(value));
  DCHECK(item.second);
  return item.first->second;
}