Coverage Report

Created: 2026-09-14 20:36

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/util/time.h
Line
Count
Source
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-present The Bitcoin Core developers
3
// Distributed under the MIT software license, see the accompanying
4
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6
#ifndef BITCOIN_UTIL_TIME_H
7
#define BITCOIN_UTIL_TIME_H
8
9
// The `util/time.h` header is designed to be a drop-in replacement for `chrono`.
10
#include <chrono> // IWYU pragma: export
11
#include <cstdint>
12
#include <ctime>
13
#include <optional>
14
#include <string>
15
#include <string_view>
16
17
#ifdef WIN32
18
#include <winsock2.h>
19
#else
20
#include <sys/time.h>
21
#endif
22
23
using namespace std::chrono_literals;
24
25
/// Version of the system clock that is mockable in the context of tests (via
26
/// FakeNodeClock or ::SetMockTime), otherwise the system clock.
27
struct NodeClock : public std::chrono::system_clock {
28
    using time_point = std::chrono::time_point<NodeClock>;
29
    /** Return current system time or mocked time, if set */
30
    static time_point now() noexcept;
31
    static std::time_t to_time_t(const time_point&) = delete; // unused
32
    static time_point from_time_t(std::time_t) = delete;      // unused
33
    static constexpr time_point epoch{};
34
};
35
using NodeSeconds = std::chrono::time_point<NodeClock, std::chrono::seconds>;
36
37
using SteadyClock = std::chrono::steady_clock;
38
using SteadySeconds = std::chrono::time_point<std::chrono::steady_clock, std::chrono::seconds>;
39
using SteadyMilliseconds = std::chrono::time_point<std::chrono::steady_clock, std::chrono::milliseconds>;
40
using SteadyMicroseconds = std::chrono::time_point<std::chrono::steady_clock, std::chrono::microseconds>;
41
42
using SystemClock = std::chrono::system_clock;
43
44
/// Version of SteadyClock that is mockable in the context of tests (via
45
/// FakeSteadyClock, or Self::SetMockTime), otherwise the system steady
46
/// clock.
47
struct MockableSteadyClock : public std::chrono::steady_clock {
48
    using time_point = std::chrono::time_point<MockableSteadyClock>;
49
50
    using mock_time_point = std::chrono::time_point<MockableSteadyClock, std::chrono::milliseconds>;
51
    static constexpr mock_time_point::duration INITIAL_MOCK_TIME{1};
52
53
    /** Return current system time or mocked time, if set */
54
    static time_point now() noexcept;
55
    static std::time_t to_time_t(const time_point&) = delete; // unused
56
    static time_point from_time_t(std::time_t) = delete;      // unused
57
58
    /** Set mock time for testing.
59
     * When mocking the steady clock, start at INITIAL_MOCK_TIME and add durations to elapse time as necessary
60
     * for testing.
61
     * To stop mocking, call ClearMockTime().
62
     */
63
    static void SetMockTime(mock_time_point::duration mock_time_in);
64
65
    /** Clear mock time, go back to system steady clock. */
66
    static void ClearMockTime();
67
};
68
69
void UninterruptibleSleep(const std::chrono::microseconds& n);
70
71
/**
72
 * Helper to count the seconds of a duration/time_point.
73
 *
74
 * All durations/time_points should be using std::chrono and calling this should generally
75
 * be avoided in code. Though, it is still preferred to an inline t.count() to
76
 * protect against a reliance on the exact type of t.
77
 *
78
 * This helper is used to convert durations/time_points before passing them over an
79
 * interface that doesn't support std::chrono (e.g. RPC, debug log, or the GUI)
80
 */
81
template <typename Dur1, typename Dur2>
82
constexpr auto Ticks(Dur2 d)
83
18.4M
{
84
18.4M
    return std::chrono::duration_cast<Dur1>(d).count();
85
18.4M
}
auto Ticks<std::chrono::duration<long, std::ratio<1l, 1000000l>>, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>(std::chrono::duration<long, std::ratio<1l, 1000000000l>>)
Line
Count
Source
83
6.87M
{
84
6.87M
    return std::chrono::duration_cast<Dur1>(d).count();
85
6.87M
}
auto Ticks<std::chrono::duration<double, std::ratio<1l, 1000l>>, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>(std::chrono::duration<long, std::ratio<1l, 1000000000l>>)
Line
Count
Source
83
3.13M
{
84
3.13M
    return std::chrono::duration_cast<Dur1>(d).count();
85
3.13M
}
auto Ticks<std::chrono::duration<double, std::ratio<1l, 1l>>, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>(std::chrono::duration<long, std::ratio<1l, 1000000000l>>)
Line
Count
Source
83
1.37M
{
84
1.37M
    return std::chrono::duration_cast<Dur1>(d).count();
85
1.37M
}
auto Ticks<std::chrono::duration<long, std::ratio<1l, 1l>>, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>(std::chrono::duration<long, std::ratio<1l, 1000000000l>>)
Line
Count
Source
83
683k
{
84
683k
    return std::chrono::duration_cast<Dur1>(d).count();
85
683k
}
auto Ticks<std::chrono::duration<double, std::ratio<1l, 1l>>, std::chrono::duration<long, std::ratio<1l, 1l>>>(std::chrono::duration<long, std::ratio<1l, 1l>>)
Line
Count
Source
83
4
{
84
4
    return std::chrono::duration_cast<Dur1>(d).count();
85
4
}
auto Ticks<std::chrono::duration<long, std::ratio<1l, 1000l>>, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>(std::chrono::duration<long, std::ratio<1l, 1000000000l>>)
Line
Count
Source
83
4.84k
{
84
4.84k
    return std::chrono::duration_cast<Dur1>(d).count();
85
4.84k
}
auto Ticks<std::chrono::duration<long, std::ratio<1l, 1l>>, std::chrono::duration<long, std::ratio<1l, 1l>>>(std::chrono::duration<long, std::ratio<1l, 1l>>)
Line
Count
Source
83
6.03M
{
84
6.03M
    return std::chrono::duration_cast<Dur1>(d).count();
85
6.03M
}
auto Ticks<std::chrono::duration<long, std::ratio<1l, 1l>>, std::chrono::duration<long, std::ratio<1l, 1000l>>>(std::chrono::duration<long, std::ratio<1l, 1000l>>)
Line
Count
Source
83
6
{
84
6
    return std::chrono::duration_cast<Dur1>(d).count();
85
6
}
auto Ticks<std::chrono::duration<long, std::ratio<1l, 1l>>, std::chrono::duration<long, std::ratio<3600l, 1l>>>(std::chrono::duration<long, std::ratio<3600l, 1l>>)
Line
Count
Source
83
315k
{
84
315k
    return std::chrono::duration_cast<Dur1>(d).count();
85
315k
}
auto Ticks<std::chrono::duration<long, std::ratio<3600l, 1l>>, std::chrono::duration<long, std::ratio<3600l, 1l>>>(std::chrono::duration<long, std::ratio<3600l, 1l>>)
Line
Count
Source
83
2.00k
{
84
2.00k
    return std::chrono::duration_cast<Dur1>(d).count();
85
2.00k
}
auto Ticks<std::chrono::duration<double, std::ratio<3600l, 1l>>, std::chrono::duration<long, std::ratio<1l, 1l>>>(std::chrono::duration<long, std::ratio<1l, 1l>>)
Line
Count
Source
83
691
{
84
691
    return std::chrono::duration_cast<Dur1>(d).count();
85
691
}
auto Ticks<std::chrono::duration<long, std::ratio<60l, 1l>>, std::chrono::duration<long, std::ratio<60l, 1l>>>(std::chrono::duration<long, std::ratio<60l, 1l>>)
Line
Count
Source
83
11
{
84
11
    return std::chrono::duration_cast<Dur1>(d).count();
85
11
}
86
87
template <typename Duration>
88
constexpr int64_t TicksSeconds(Duration d)
89
17
{
90
17
    return int64_t{Ticks<std::chrono::seconds>(d)};
91
17
}
long TicksSeconds<std::chrono::duration<long, std::ratio<1l, 1l>>>(std::chrono::duration<long, std::ratio<1l, 1l>>)
Line
Count
Source
89
9
{
90
9
    return int64_t{Ticks<std::chrono::seconds>(d)};
91
9
}
long TicksSeconds<std::chrono::duration<long, std::ratio<1l, 1000l>>>(std::chrono::duration<long, std::ratio<1l, 1000l>>)
Line
Count
Source
89
6
{
90
6
    return int64_t{Ticks<std::chrono::seconds>(d)};
91
6
}
long TicksSeconds<std::chrono::duration<long, std::ratio<1l, 1000000000l>>>(std::chrono::duration<long, std::ratio<1l, 1000000000l>>)
Line
Count
Source
89
2
{
90
2
    return int64_t{Ticks<std::chrono::seconds>(d)};
91
2
}
92
template <typename Duration, typename Timepoint>
93
constexpr auto TicksSinceEpoch(Timepoint t)
94
6.69M
{
95
6.69M
    return Ticks<Duration>(t.time_since_epoch());
96
6.69M
}
auto TicksSinceEpoch<std::chrono::duration<long, std::ratio<1l, 1l>>, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>>(std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>)
Line
Count
Source
94
681k
{
95
681k
    return Ticks<Duration>(t.time_since_epoch());
96
681k
}
auto TicksSinceEpoch<std::chrono::duration<double, std::ratio<1l, 1l>>, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1l>>>>(std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1l>>>)
Line
Count
Source
94
4
{
95
4
    return Ticks<Duration>(t.time_since_epoch());
96
4
}
auto TicksSinceEpoch<std::chrono::duration<long, std::ratio<1l, 1000l>>, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>>(std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>)
Line
Count
Source
94
4
{
95
4
    return Ticks<Duration>(t.time_since_epoch());
96
4
}
auto TicksSinceEpoch<std::chrono::duration<long, std::ratio<1l, 1l>>, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1l>>>>(std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1l>>>)
Line
Count
Source
94
272k
{
95
272k
    return Ticks<Duration>(t.time_since_epoch());
96
272k
}
auto TicksSinceEpoch<std::chrono::duration<long, std::ratio<1l, 1000l>>, std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>>(std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>)
Line
Count
Source
94
17
{
95
17
    return Ticks<Duration>(t.time_since_epoch());
96
17
}
auto TicksSinceEpoch<std::chrono::duration<long, std::ratio<1l, 1l>>, std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1l>>>>(std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1l>>>)
Line
Count
Source
94
5.74M
{
95
5.74M
    return Ticks<Duration>(t.time_since_epoch());
96
5.74M
}
97
1.16M
constexpr int64_t count_seconds(std::chrono::seconds t) { return t.count(); }
98
770k
constexpr int64_t count_milliseconds(std::chrono::milliseconds t) { return t.count(); }
99
0
constexpr int64_t count_microseconds(std::chrono::microseconds t) { return t.count(); }
100
101
using HoursDouble = std::chrono::duration<double, std::chrono::hours::period>;
102
using SecondsDouble = std::chrono::duration<double, std::chrono::seconds::period>;
103
using MillisecondsDouble = std::chrono::duration<double, std::chrono::milliseconds::period>;
104
105
/**
106
 * DEPRECATED
107
 * Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
108
 * ClockType is
109
 * - SteadyClock/std::chrono::steady_clock for steady time
110
 * - SystemClock/std::chrono::system_clock for system time
111
 * - NodeClock                             for mockable system time
112
 */
113
int64_t GetTime();
114
115
/** For testing. Set e.g. with the setmocktime rpc, or -mocktime argument */
116
void SetMockTime(std::chrono::seconds mock_time_in);
117
void SetMockTime(std::chrono::time_point<NodeClock, std::chrono::seconds> mock);
118
119
/** For testing */
120
std::chrono::seconds GetMockTime();
121
122
/**
123
 * Return the current time point cast to the given precision. Only use this
124
 * when an exact precision is needed, otherwise use T::clock::now() directly.
125
 */
126
template <typename T>
127
T Now()
128
2.41M
{
129
2.41M
    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
130
2.41M
}
std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1l>>> Now<std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1l>>>>()
Line
Count
Source
128
1.09M
{
129
1.09M
    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
130
1.09M
}
std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1l>>> Now<std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1l>>>>()
Line
Count
Source
128
903k
{
129
903k
    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
130
903k
}
std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000l>>> Now<std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000l>>>>()
Line
Count
Source
128
444
{
129
444
    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
130
444
}
std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000l>>> Now<std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000l>>>>()
Line
Count
Source
128
421k
{
129
421k
    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
130
421k
}
std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000l>>> Now<std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000l>>>>()
Line
Count
Source
128
981
{
129
981
    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
130
981
}
131
/** DEPRECATED, see GetTime */
132
template <typename T>
133
T GetTime()
134
1.43M
{
135
1.43M
    return Now<std::chrono::time_point<NodeClock, T>>().time_since_epoch();
136
1.43M
}
std::chrono::duration<long, std::ratio<1l, 1l>> GetTime<std::chrono::duration<long, std::ratio<1l, 1l>>>()
Line
Count
Source
134
1.01M
{
135
1.01M
    return Now<std::chrono::time_point<NodeClock, T>>().time_since_epoch();
136
1.01M
}
std::chrono::duration<long, std::ratio<1l, 1000l>> GetTime<std::chrono::duration<long, std::ratio<1l, 1000l>>>()
Line
Count
Source
134
444
{
135
444
    return Now<std::chrono::time_point<NodeClock, T>>().time_since_epoch();
136
444
}
std::chrono::duration<long, std::ratio<1l, 1000000l>> GetTime<std::chrono::duration<long, std::ratio<1l, 1000000l>>>()
Line
Count
Source
134
421k
{
135
421k
    return Now<std::chrono::time_point<NodeClock, T>>().time_since_epoch();
136
421k
}
137
138
/**
139
 * ISO 8601 formatting is preferred. Use the FormatISO8601{DateTime,Date}
140
 * helper functions if possible.
141
 */
142
std::string FormatISO8601DateTime(int64_t nTime);
143
std::string FormatISO8601Date(int64_t nTime);
144
std::optional<int64_t> ParseISO8601DateTime(std::string_view str);
145
146
/**
147
 * RFC1123 formatting https://www.rfc-editor.org/rfc/rfc1123#section-5.2.14
148
 * Used in HTTP/1.1 responses
149
 */
150
std::string FormatRFC1123DateTime(int64_t nTime);
151
152
/**
153
 * Convert milliseconds to a struct timeval for e.g. select.
154
 */
155
struct timeval MillisToTimeval(int64_t nTimeout);
156
157
/**
158
 * Convert milliseconds to a struct timeval for e.g. select.
159
 */
160
struct timeval MillisToTimeval(std::chrono::milliseconds ms);
161
162
#endif // BITCOIN_UTIL_TIME_H