userver: userver/utils/statistics/rate_counter.hpp Source File
Loading...
Searching...
No Matches
rate_counter.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/utils/statistics/rate_counter.hpp
4/// @brief @copybrief utils::statistics::RateCounter
5
6#include <atomic>
7
8#include <userver/utils/statistics/rate.hpp>
9
10USERVER_NAMESPACE_BEGIN
11
12namespace utils::statistics {
13
14class Writer;
15
16/// @ingroup userver_universal
17///
18/// @brief Atomic counter of type Rate with relaxed memory ordering
19///
20/// This class is represented as Rate metric when serializing to statistics.
21/// Otherwise it is the same class as @ref utils::statistics::RelaxedCounter.
22class RateCounter final {
23public:
24 using ValueType = Rate;
25
26 constexpr RateCounter() noexcept = default;
27
28 constexpr explicit RateCounter(Rate desired) noexcept : val_(desired.value) {}
29
30 constexpr explicit RateCounter(Rate::ValueType desired) noexcept : val_(desired) {}
31
32 RateCounter(const RateCounter& other) noexcept : val_(other.Load().value) {}
33
34 RateCounter& operator=(const RateCounter& other) noexcept {
35 if (this == &other) {
36 return *this;
37 }
38
39 Store(other.Load());
40 return *this;
41 }
42
43 RateCounter& operator=(Rate desired) noexcept {
44 Store(desired);
45 return *this;
46 }
47
48 void Store(Rate desired, std::memory_order order = std::memory_order_relaxed) noexcept {
49 val_.store(desired.value, order);
50 }
51
52 Rate Load() const noexcept { return Rate{val_.load(std::memory_order_relaxed)}; }
53
54 void Add(Rate arg, std::memory_order order = std::memory_order_relaxed) noexcept {
55 val_.fetch_add(arg.value, order);
56 }
57
58 void AddAsSingleProducer(Rate arg) noexcept {
59 val_.store(val_.load(std::memory_order_relaxed) + arg.value, std::memory_order_relaxed);
60 }
61
62 Rate operator++() noexcept { return Rate{val_.fetch_add(1, std::memory_order_relaxed) + 1}; }
63
64 Rate operator++(int) noexcept { return Rate{val_.fetch_add(1, std::memory_order_relaxed)}; }
65
66 Rate operator+=(Rate arg) noexcept {
67 return Rate{val_.fetch_add(arg.value, std::memory_order_relaxed) + arg.value};
68 }
69
70 Rate operator+=(const RateCounter& arg) noexcept { return *this += arg.Load(); }
71
72private:
73 static_assert(std::atomic<Rate::ValueType>::is_always_lock_free);
74
75 std::atomic<Rate::ValueType> val_{0};
76};
77
78void DumpMetric(Writer& writer, const RateCounter& value);
79
80void ResetMetric(RateCounter& value);
81
82} // namespace utils::statistics
83
84USERVER_NAMESPACE_END