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;
}