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