// By convention, we are using microsecond units
struct Bucket
{
- std::string d_name;
- uint64_t d_boundary{0};
- uint64_t d_count{0};
+ const std::string d_name;
+ const uint64_t d_boundary{0};
+ mutable uint64_t d_count{0};
};
struct AtomicBucket
AtomicBucket(const AtomicBucket& rhs) :
d_name(rhs.d_name), d_boundary(rhs.d_boundary), d_count(rhs.d_count.load()) {}
- std::string d_name;
- uint64_t d_boundary{0};
- std::atomic<uint64_t> d_count{0};
+ const std::string d_name;
+ const uint64_t d_boundary{0};
+ mutable std::atomic<uint64_t> d_count{0};
};
template <class B>
return b <= bu.d_boundary;
}
- inline void operator()(uint64_t d)
+ inline void operator()(uint64_t d) const
{
auto index = std::upper_bound(d_buckets.begin(), d_buckets.end(), d, lessOrEqual);
// our index is always valid
void ResponseStats::submitResponse(uint16_t qtype, uint16_t respsize, uint8_t rcode, bool udpOrTCP)
{
- d_rcodecounters[rcode]++;
+ d_rcodecounters.at(rcode)++;
submitResponse(qtype, respsize, udpOrTCP);
}
void ResponseStats::submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP)
{
- d_qtypecounters[qtype]++;
+ d_qtypecounters.at(qtype)++;
d_sizecounters(respsize);
}
-map<uint16_t, uint64_t> ResponseStats::getQTypeResponseCounts()
+map<uint16_t, uint64_t> ResponseStats::getQTypeResponseCounts() const
{
map<uint16_t, uint64_t> ret;
uint64_t count;
for (unsigned int i = 0; i < 65535; ++i) {
- count = d_qtypecounters[i];
+ count = d_qtypecounters.at(i);
if (count) {
ret[i] = count;
}
return ret;
}
-map<uint16_t, uint64_t> ResponseStats::getSizeResponseCounts()
+map<uint16_t, uint64_t> ResponseStats::getSizeResponseCounts() const
{
map<uint16_t, uint64_t> ret;
for (const auto& sizecounter : d_sizecounters.getRawData()) {
return ret;
}
-map<uint8_t, uint64_t> ResponseStats::getRCodeResponseCounts()
+map<uint8_t, uint64_t> ResponseStats::getRCodeResponseCounts() const
{
map<uint8_t, uint64_t> ret;
uint64_t count;
for (unsigned int i = 0; i < 256; ++i) {
- count = d_rcodecounters[i];
+ count = d_rcodecounters.at(i);
if (count) {
ret[i] = count;
}
return ret;
}
-string ResponseStats::getQTypeReport()
+string ResponseStats::getQTypeReport() const
{
auto qtypenums = getQTypeResponseCounts();
ostringstream os;
void submitResponse(DNSPacket& p, bool udpOrTCP, bool last = true);
void submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP);
void submitResponse(uint16_t qtype, uint16_t respsize, uint8_t rcode, bool udpOrTCP);
- map<uint16_t, uint64_t> getQTypeResponseCounts();
- map<uint16_t, uint64_t> getSizeResponseCounts();
- map<uint8_t, uint64_t> getRCodeResponseCounts();
- string getQTypeReport();
+ map<uint16_t, uint64_t> getQTypeResponseCounts() const;
+ map<uint16_t, uint64_t> getSizeResponseCounts() const;
+ map<uint8_t, uint64_t> getRCodeResponseCounts() const;
+ string getQTypeReport() const;
private:
std::array<std::atomic<uint64_t>, 65535> d_qtypecounters;