/root/bitcoin/src/node/kernel_notifications.h
Line | Count | Source |
1 | | // Copyright (c) 2023-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_KERNEL_NOTIFICATIONS_H |
6 | | #define BITCOIN_NODE_KERNEL_NOTIFICATIONS_H |
7 | | |
8 | | #include <kernel/notifications_interface.h> |
9 | | |
10 | | #include <sync.h> |
11 | | #include <threadsafety.h> |
12 | | #include <uint256.h> |
13 | | |
14 | | #include <atomic> |
15 | | #include <cstdint> |
16 | | #include <functional> |
17 | | |
18 | | class ArgsManager; |
19 | | class CBlockIndex; |
20 | | enum class SynchronizationState; |
21 | | struct bilingual_str; |
22 | | |
23 | | namespace kernel { |
24 | | enum class Warning; |
25 | | } // namespace kernel |
26 | | |
27 | | namespace node { |
28 | | |
29 | | class Warnings; |
30 | | static constexpr int DEFAULT_STOPATHEIGHT{0}; |
31 | | |
32 | | //! State tracked by the KernelNotifications interface meant to be used by |
33 | | //! mining code, index code, RPCs, and other code sitting above the validation |
34 | | //! layer. |
35 | | //! |
36 | | //! Currently just tracks the chain tip, but could be used to hold other |
37 | | //! information in the future, like the last flushed block, pruning |
38 | | //! information, etc. |
39 | | struct KernelState { |
40 | | bool chainstate_loaded{false}; |
41 | | std::optional<uint256> tip_block; |
42 | | }; |
43 | | |
44 | | class KernelNotifications : public kernel::Notifications |
45 | | { |
46 | | public: |
47 | | KernelNotifications(const std::function<bool()>& shutdown_request, std::atomic<int>& exit_status, node::Warnings& warnings) |
48 | 0 | : m_shutdown_request(shutdown_request), m_exit_status{exit_status}, m_warnings{warnings} {} |
49 | | |
50 | | [[nodiscard]] kernel::InterruptResult blockTip(SynchronizationState state, const CBlockIndex& index, double verification_progress) override EXCLUSIVE_LOCKS_REQUIRED(!m_tip_block_mutex); |
51 | | |
52 | | void headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync) override; |
53 | | |
54 | | void progress(const bilingual_str& title, int progress_percent, bool resume_possible) override; |
55 | | |
56 | | void warningSet(kernel::Warning id, const bilingual_str& message) override; |
57 | | |
58 | | void warningUnset(kernel::Warning id) override; |
59 | | |
60 | | void flushError(const bilingual_str& message) override; |
61 | | |
62 | | void fatalError(const bilingual_str& message) override; |
63 | | |
64 | 0 | void setChainstateLoaded(bool chainstate_loaded) EXCLUSIVE_LOCKS_REQUIRED(!m_tip_block_mutex) { |
65 | 0 | LOCK(m_tip_block_mutex); Line | Count | Source | 266 | 0 | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) Line | Count | Source | 11 | 0 | #define UNIQUE_NAME(name) PASTE2(name, __COUNTER__) Line | Count | Source | 9 | 0 | #define PASTE2(x, y) PASTE(x, y) Line | Count | Source | 8 | 0 | #define PASTE(x, y) x ## y |
|
|
|
|
66 | 0 | if (!chainstate_loaded) m_state = {}; |
67 | 0 | m_state.chainstate_loaded = chainstate_loaded; |
68 | 0 | m_tip_block_cv.notify_all(); |
69 | 0 | } |
70 | | |
71 | | //! Block height after which blockTip notification will return Interrupted{}, if >0. |
72 | | int m_stop_at_height{DEFAULT_STOPATHEIGHT}; |
73 | | //! Useful for tests, can be set to false to avoid shutdown on fatal error. |
74 | | bool m_shutdown_on_fatal_error{true}; |
75 | | |
76 | | Mutex m_tip_block_mutex; |
77 | | std::condition_variable m_tip_block_cv GUARDED_BY(m_tip_block_mutex); |
78 | | KernelState m_state GUARDED_BY(m_tip_block_mutex); |
79 | | //! The block for which the last blockTip notification was received. |
80 | | //! It's first set when the tip is connected during node initialization. |
81 | | //! Might be unset during an early shutdown. |
82 | | std::optional<uint256> TipBlock() EXCLUSIVE_LOCKS_REQUIRED(m_tip_block_mutex); |
83 | | |
84 | | private: |
85 | | const std::function<bool()>& m_shutdown_request; |
86 | | std::atomic<int>& m_exit_status; |
87 | | node::Warnings& m_warnings; |
88 | | }; |
89 | | |
90 | | void ReadNotificationArgs(const ArgsManager& args, KernelNotifications& notifications); |
91 | | |
92 | | } // namespace node |
93 | | |
94 | | #endif // BITCOIN_NODE_KERNEL_NOTIFICATIONS_H |