std::map<std::string, std::list<std::pair<DNSName, unsigned int>>> smtData;
};
- /* Protects s_topNMGsByReason and s_topSMTsByReason. s_metricsData should only be accessed
- by the dynamic blocks maintenance thread so it does not need a lock. */
- static std::mutex s_topsMutex;
+ struct Tops
+ {
+ std::map<std::string, std::list<std::pair<Netmask, unsigned int>>> topNMGsByReason;
+ std::map<std::string, std::list<std::pair<DNSName, unsigned int>>> topSMTsByReason;
+ };
+
+ static LockGuarded<Tops> s_tops;
+ /* s_metricsData should only be accessed by the dynamic blocks maintenance thread so it does not need a lock */
// need N+1 datapoints to be able to do the diff after a collection point has been reached
static std::list<MetricsSnapshot> s_metricsData;
- static std::map<std::string, std::list<std::pair<Netmask, unsigned int>>> s_topNMGsByReason;
- static std::map<std::string, std::list<std::pair<DNSName, unsigned int>>> s_topSMTsByReason;
static size_t s_topN;
};
unsigned int lastSeenValue{0};
};
-std::mutex DynBlockMaintenance::s_topsMutex;
std::list<DynBlockMaintenance::MetricsSnapshot> DynBlockMaintenance::s_metricsData;
-std::map<std::string, std::list<std::pair<Netmask, unsigned int>>> DynBlockMaintenance::s_topNMGsByReason;
-std::map<std::string, std::list<std::pair<DNSName, unsigned int>>> DynBlockMaintenance::s_topSMTsByReason;
+
+LockGuarded<DynBlockMaintenance::Tops> DynBlockMaintenance::s_tops;
size_t DynBlockMaintenance::s_topN{20};
time_t DynBlockMaintenance::s_expiredDynBlocksPurgeInterval{60};
}
{
- std::lock_guard<std::mutex> lock(s_topsMutex);
- s_topNMGsByReason = std::move(topNMGs);
- s_topSMTsByReason = std::move(topSMTs);
+ auto tops = s_tops.lock();
+ tops->topNMGsByReason = std::move(topNMGs);
+ tops->topSMTsByReason = std::move(topSMTs);
}
}
std::map<std::string, std::list<std::pair<Netmask, unsigned int>>> DynBlockMaintenance::getHitsForTopNetmasks()
{
- std::lock_guard<std::mutex> lock(s_topsMutex);
- return s_topNMGsByReason;
+ return s_tops.lock()->topNMGsByReason;
}
std::map<std::string, std::list<std::pair<DNSName, unsigned int>>> DynBlockMaintenance::getHitsForTopSuffixes()
{
- std::lock_guard<std::mutex> lock(s_topsMutex);
- return s_topSMTsByReason;
+ return s_tops.lock()->topSMTsByReason;
}