userver
C++ Async Framework
Toggle main menu visibility
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
10
USERVER_NAMESPACE_BEGIN
11
12
namespace
utils
::
statistics
{
13
14
class
Writer;
15
16
/// @ingroup userver_universal
17
///
18
/// @brief Atomic counter of type Rate with relaxed memory ordering by default
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.
22
class
RateCounter
final
{
23
public
:
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
void
Increment()
noexcept
{ val_.fetch_add(1, std::memory_order_relaxed); }
63
64
Rate
operator++()
noexcept
{
return
Rate
{val_.fetch_add(1, std::memory_order_relaxed) + 1}; }
65
66
Rate
operator++(
int
)
noexcept
{
return
Rate
{val_.fetch_add(1, std::memory_order_relaxed)}; }
67
68
Rate
operator+=(
Rate
arg)
noexcept
{
69
return
Rate
{val_.fetch_add(arg.value, std::memory_order_relaxed) + arg.value};
70
}
71
72
Rate
operator+=(
const
RateCounter& arg)
noexcept
{
return
*
this
+= arg.Load(); }
73
74
private
:
75
static_assert
(std::atomic<
Rate
::ValueType>::is_always_lock_free);
76
77
std::atomic<
Rate
::ValueType> val_{0};
78
};
79
80
void
DumpMetric(Writer& writer,
const
RateCounter& value);
81
82
void
ResetMetric(RateCounter& value);
83
84
}
// namespace utils::statistics
85
86
USERVER_NAMESPACE_END
userver
utils
statistics
rate_counter.hpp
Generated on
for userver by
Doxygen
1.17.0