Bitcoin Core Fuzz Coverage Report

Coverage Report

Created: 2026-03-24 13:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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