ExportedHistogramMap::HistogramPtr ExportedHistogramMap::getOrCreateUnlocked()

in fb303/ExportedHistogramMap.cpp [48:89]


ExportedHistogramMap::HistogramPtr ExportedHistogramMap::getOrCreateUnlocked(
    StringPiece name,
    const ExportedHistogram* copyMe,
    bool* createdPtr) {
  if (createdPtr) {
    *createdPtr = false;
  }

  auto hist = getHistogramUnlocked(name);
  if (hist != nullptr) {
    return hist;
  }

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

  bool inserted;
  {
    // The returned iterator may be invalidated by a concurrent insert, so it
    // must be dereferenced before releasing the lock guard.
    auto lockedHistMap = histMap_.lock();
    auto item = lockedHistMap->insert({name, std::move(value)});
    inserted = item.second;
    hist = item.first->second;
    CHECK(hist);
  }

  if (inserted) {
    if (copyMe) {
      hist->lock()->clear();
    }
    HistogramExporter::exportBuckets(hist, name, dynamicStrings_);
  }

  if (createdPtr) {
    *createdPtr = inserted;
  }

  return hist;
}