From: Remi Gacogne Date: Thu, 20 May 2021 06:38:59 +0000 (+0200) Subject: rec: Convert the dynmetrics to LockGuarded X-Git-Tag: dnsdist-1.7.0-alpha1~62^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13bf97469d960aa8c45f2101ec4aef39db4e4023;p=thirdparty%2Fpdns.git rec: Convert the dynmetrics to LockGuarded --- diff --git a/pdns/rec_channel_rec.cc b/pdns/rec_channel_rec.cc index 17dff3c155..b8231e4ab5 100644 --- a/pdns/rec_channel_rec.cc +++ b/pdns/rec_channel_rec.cc @@ -79,13 +79,12 @@ static map*> d_getatomics; static map> d_get64bitmembers; static map> d_getmultimembers; -static std::mutex d_dynmetricslock; struct dynmetrics { std::atomic *d_ptr; std::string d_prometheusName; }; -static map d_dynmetrics; +static LockGuarded> d_dynmetrics; static std::map> s_disabledStats; @@ -139,10 +138,11 @@ static std::string getPrometheusName(const std::string& arg) std::atomic* getDynMetric(const std::string& str, const std::string& prometheusName) { - std::lock_guard l(d_dynmetricslock); - auto f = d_dynmetrics.find(str); - if(f != d_dynmetrics.end()) + auto dm = d_dynmetrics.lock(); + auto f = dm->find(str); + if (f != dm->end()) { return f->second.d_ptr; + } std::string name(str); if (!prometheusName.empty()) { @@ -152,7 +152,7 @@ std::atomic* getDynMetric(const std::string& str, const std::stri } auto ret = dynmetrics{new std::atomic(), name}; - d_dynmetrics[str]= ret; + (*dm)[str]= ret; return ret.d_ptr; } @@ -167,10 +167,13 @@ static boost::optional get(const string& name) if(d_get64bitmembers.count(name)) return d_get64bitmembers.find(name)->second(); - std::lock_guard l(d_dynmetricslock); - auto f = rplookup(d_dynmetrics, name); - if (f) - return f->d_ptr->load(); + { + auto dm = d_dynmetrics.lock(); + auto f = rplookup(*dm, name); + if (f) { + return f->d_ptr->load(); + } + } for(const auto& themultimember : d_getmultimembers) { const auto items = themultimember.second(); @@ -217,8 +220,7 @@ StatsMap getAllStatsMap(StatComponent component) } { - std::lock_guard l(d_dynmetricslock); - for(const auto& a : d_dynmetrics) { + for(const auto& a : *(d_dynmetrics.lock())) { if (disabledlistMap.count(a.first) == 0) { ret.insert(make_pair(a.first, StatsMapEntry{a.second.d_prometheusName, std::to_string(*a.second.d_ptr)})); }