Branch data Line data Source code
1 : : // Copyright (c) 2024-present The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #ifndef BITCOIN_NODE_TIMEOFFSETS_H
6 : : #define BITCOIN_NODE_TIMEOFFSETS_H
7 : :
8 : : #include <sync.h>
9 : :
10 : : #include <chrono>
11 : : #include <cstddef>
12 : : #include <deque>
13 : :
14 : : namespace node {
15 : : class Warnings;
16 : : } // namespace node
17 : :
18 : 5 : class TimeOffsets
19 : : {
20 : : public:
21 : 176 : TimeOffsets(node::Warnings& warnings) : m_warnings{warnings} {}
22 : :
23 : : private:
24 : : //! Maximum number of timeoffsets stored.
25 : : static constexpr size_t MAX_SIZE{50};
26 : : //! Minimum difference between system and network time for a warning to be raised.
27 : : static constexpr std::chrono::minutes WARN_THRESHOLD{10};
28 : :
29 : : mutable Mutex m_mutex;
30 : : /** The observed time differences between our local clock and those of our outbound peers. A
31 : : * positive offset means our peer's clock is ahead of our local clock. */
32 : : std::deque<std::chrono::seconds> m_offsets GUARDED_BY(m_mutex){};
33 : :
34 : : node::Warnings& m_warnings;
35 : :
36 : : public:
37 : : /** Add a new time offset sample. */
38 : : void Add(std::chrono::seconds offset) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
39 : :
40 : : /** Compute and return the median of the collected time offset samples. The median is returned
41 : : * as 0 when there are less than 5 samples. */
42 : : std::chrono::seconds Median() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
43 : :
44 : : /** Raise warnings if the median time offset exceeds the warnings threshold. Returns true if
45 : : * warnings were raised. */
46 : : bool WarnIfOutOfSync() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
47 : : };
48 : :
49 : : #endif // BITCOIN_NODE_TIMEOFFSETS_H
|