fuzz coverage

Coverage Report

Created: 2025-08-28 15:26

/Users/eugenesiegel/btc/bitcoin/src/validationinterface.cpp
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-2022 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
#include <validationinterface.h>
7
8
#include <chain.h>
9
#include <consensus/validation.h>
10
#include <kernel/chain.h>
11
#include <kernel/mempool_entry.h>
12
#include <kernel/mempool_removal_reason.h>
13
#include <logging.h>
14
#include <primitives/block.h>
15
#include <primitives/transaction.h>
16
#include <util/check.h>
17
#include <util/task_runner.h>
18
19
#include <future>
20
#include <unordered_map>
21
#include <utility>
22
23
/**
24
 * ValidationSignalsImpl manages a list of shared_ptr<CValidationInterface> callbacks.
25
 *
26
 * A std::unordered_map is used to track what callbacks are currently
27
 * registered, and a std::list is used to store the callbacks that are
28
 * currently registered as well as any callbacks that are just unregistered
29
 * and about to be deleted when they are done executing.
30
 */
31
class ValidationSignalsImpl
32
{
33
private:
34
    Mutex m_mutex;
35
    //! List entries consist of a callback pointer and reference count. The
36
    //! count is equal to the number of current executions of that entry, plus 1
37
    //! if it's registered. It cannot be 0 because that would imply it is
38
    //! unregistered and also not being executed (so shouldn't exist).
39
    struct ListEntry { std::shared_ptr<CValidationInterface> callbacks; int count = 1; };
40
    std::list<ListEntry> m_list GUARDED_BY(m_mutex);
41
    std::unordered_map<CValidationInterface*, std::list<ListEntry>::iterator> m_map GUARDED_BY(m_mutex);
42
43
public:
44
    std::unique_ptr<util::TaskRunnerInterface> m_task_runner;
45
46
    explicit ValidationSignalsImpl(std::unique_ptr<util::TaskRunnerInterface> task_runner)
47
7.28k
        : m_task_runner{std::move(Assert(task_runner))} {}
Line
Count
Source
106
7.28k
#define Assert(val) inline_assertion_check<true>(val, __FILE__, __LINE__, __func__, #val)
48
49
    void Register(std::shared_ptr<CValidationInterface> callbacks) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
50
7.28k
    {
51
7.28k
        LOCK(m_mutex);
Line
Count
Source
257
7.28k
#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
Line
Count
Source
11
7.28k
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
7.28k
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
7.28k
#define PASTE(x, y) x ## y
52
7.28k
        auto inserted = m_map.emplace(callbacks.get(), m_list.end());
53
7.28k
        if (inserted.second) inserted.first->second = m_list.emplace(m_list.end());
54
7.28k
        inserted.first->second->callbacks = std::move(callbacks);
55
7.28k
    }
56
57
    void Unregister(CValidationInterface* callbacks) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
58
0
    {
59
0
        LOCK(m_mutex);
Line
Count
Source
257
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
60
0
        auto it = m_map.find(callbacks);
61
0
        if (it != m_map.end()) {
62
0
            if (!--it->second->count) m_list.erase(it->second);
63
0
            m_map.erase(it);
64
0
        }
65
0
    }
66
67
    //! Clear unregisters every previously registered callback, erasing every
68
    //! map entry. After this call, the list may still contain callbacks that
69
    //! are currently executing, but it will be cleared when they are done
70
    //! executing.
71
    void Clear() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
72
0
    {
73
0
        LOCK(m_mutex);
Line
Count
Source
257
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
74
0
        for (const auto& entry : m_map) {
75
0
            if (!--entry.second->count) m_list.erase(entry.second);
76
0
        }
77
0
        m_map.clear();
78
0
    }
79
80
    template<typename F> void Iterate(F&& f) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
81
19.0k
    {
82
19.0k
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
782
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
1.07k
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
10.4k
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
2.49k
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
782
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
782
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
0
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
670
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
1.10k
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
857
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
83
38.0k
        for (auto it = m_list.begin(); it != m_list.end();) {
84
19.0k
            ++it->count;
85
19.0k
            {
86
19.0k
                REVERSE_LOCK(lock);
Line
Count
Source
243
782
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
782
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
782
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
782
#define PASTE(x, y) x ## y
                REVERSE_LOCK(lock);
Line
Count
Source
243
1.07k
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
1.07k
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
1.07k
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
1.07k
#define PASTE(x, y) x ## y
                REVERSE_LOCK(lock);
Line
Count
Source
243
10.4k
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
10.4k
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
10.4k
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
10.4k
#define PASTE(x, y) x ## y
                REVERSE_LOCK(lock);
Line
Count
Source
243
2.49k
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
2.49k
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
2.49k
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
2.49k
#define PASTE(x, y) x ## y
                REVERSE_LOCK(lock);
Line
Count
Source
243
782
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
782
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
782
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
782
#define PASTE(x, y) x ## y
                REVERSE_LOCK(lock);
Line
Count
Source
243
782
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
782
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
782
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
782
#define PASTE(x, y) x ## y
                REVERSE_LOCK(lock);
Line
Count
Source
243
0
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __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
                REVERSE_LOCK(lock);
Line
Count
Source
243
670
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
670
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
670
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
670
#define PASTE(x, y) x ## y
                REVERSE_LOCK(lock);
Line
Count
Source
243
1.10k
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
1.10k
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
1.10k
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
1.10k
#define PASTE(x, y) x ## y
                REVERSE_LOCK(lock);
Line
Count
Source
243
857
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
857
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
857
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
857
#define PASTE(x, y) x ## y
87
19.0k
                f(*it->callbacks);
88
19.0k
            }
89
19.0k
            it = --it->count ? std::next(it) : 
m_list.erase(it)0
;
90
19.0k
        }
91
19.0k
    }
validationinterface.cpp:_ZN21ValidationSignalsImpl7IterateIZZN17ValidationSignals15UpdatedBlockTipEPK11CBlockIndexS4_bENK3$_0clEvEUlR20CValidationInterfaceE_EEvOT_
Line
Count
Source
81
782
    {
82
782
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
782
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
83
1.56k
        for (auto it = m_list.begin(); it != m_list.end();) {
84
782
            ++it->count;
85
782
            {
86
782
                REVERSE_LOCK(lock);
Line
Count
Source
243
782
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
782
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
782
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
782
#define PASTE(x, y) x ## y
87
782
                f(*it->callbacks);
88
782
            }
89
782
            it = --it->count ? std::next(it) : 
m_list.erase(it)0
;
90
782
        }
91
782
    }
validationinterface.cpp:_ZN21ValidationSignalsImpl7IterateIZN17ValidationSignals15ActiveTipChangeERK11CBlockIndexbE3$_0EEvOT_
Line
Count
Source
81
1.07k
    {
82
1.07k
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
1.07k
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
83
2.14k
        for (auto it = m_list.begin(); it != m_list.end();) {
84
1.07k
            ++it->count;
85
1.07k
            {
86
1.07k
                REVERSE_LOCK(lock);
Line
Count
Source
243
1.07k
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
1.07k
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
1.07k
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
1.07k
#define PASTE(x, y) x ## y
87
1.07k
                f(*it->callbacks);
88
1.07k
            }
89
1.07k
            it = --it->count ? std::next(it) : 
m_list.erase(it)0
;
90
1.07k
        }
91
1.07k
    }
validationinterface.cpp:_ZN21ValidationSignalsImpl7IterateIZZN17ValidationSignals25TransactionAddedToMempoolERK25NewMempoolTransactionInfoyENK3$_0clEvEUlR20CValidationInterfaceE_EEvOT_
Line
Count
Source
81
10.4k
    {
82
10.4k
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
10.4k
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
83
20.9k
        for (auto it = m_list.begin(); it != m_list.end();) {
84
10.4k
            ++it->count;
85
10.4k
            {
86
10.4k
                REVERSE_LOCK(lock);
Line
Count
Source
243
10.4k
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
10.4k
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
10.4k
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
10.4k
#define PASTE(x, y) x ## y
87
10.4k
                f(*it->callbacks);
88
10.4k
            }
89
10.4k
            it = --it->count ? std::next(it) : 
m_list.erase(it)0
;
90
10.4k
        }
91
10.4k
    }
validationinterface.cpp:_ZN21ValidationSignalsImpl7IterateIZZN17ValidationSignals29TransactionRemovedFromMempoolERKNSt3__110shared_ptrIK12CTransactionEE20MemPoolRemovalReasonyENK3$_0clEvEUlR20CValidationInterfaceE_EEvOT_
Line
Count
Source
81
2.49k
    {
82
2.49k
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
2.49k
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
83
4.99k
        for (auto it = m_list.begin(); it != m_list.end();) {
84
2.49k
            ++it->count;
85
2.49k
            {
86
2.49k
                REVERSE_LOCK(lock);
Line
Count
Source
243
2.49k
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
2.49k
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
2.49k
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
2.49k
#define PASTE(x, y) x ## y
87
2.49k
                f(*it->callbacks);
88
2.49k
            }
89
2.49k
            it = --it->count ? std::next(it) : 
m_list.erase(it)0
;
90
2.49k
        }
91
2.49k
    }
validationinterface.cpp:_ZN21ValidationSignalsImpl7IterateIZZN17ValidationSignals14BlockConnectedE14ChainstateRoleRKNSt3__110shared_ptrIK6CBlockEEPK11CBlockIndexENK3$_0clEvEUlR20CValidationInterfaceE_EEvOT_
Line
Count
Source
81
782
    {
82
782
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
782
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
83
1.56k
        for (auto it = m_list.begin(); it != m_list.end();) {
84
782
            ++it->count;
85
782
            {
86
782
                REVERSE_LOCK(lock);
Line
Count
Source
243
782
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
782
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
782
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
782
#define PASTE(x, y) x ## y
87
782
                f(*it->callbacks);
88
782
            }
89
782
            it = --it->count ? std::next(it) : 
m_list.erase(it)0
;
90
782
        }
91
782
    }
validationinterface.cpp:_ZN21ValidationSignalsImpl7IterateIZZN17ValidationSignals34MempoolTransactionsRemovedForBlockERKNSt3__16vectorI29RemovedMempoolTransactionInfoNS2_9allocatorIS4_EEEEjENK3$_0clEvEUlR20CValidationInterfaceE_EEvOT_
Line
Count
Source
81
782
    {
82
782
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
782
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
83
1.56k
        for (auto it = m_list.begin(); it != m_list.end();) {
84
782
            ++it->count;
85
782
            {
86
782
                REVERSE_LOCK(lock);
Line
Count
Source
243
782
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
782
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
782
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
782
#define PASTE(x, y) x ## y
87
782
                f(*it->callbacks);
88
782
            }
89
782
            it = --it->count ? std::next(it) : 
m_list.erase(it)0
;
90
782
        }
91
782
    }
Unexecuted instantiation: validationinterface.cpp:_ZN21ValidationSignalsImpl7IterateIZZN17ValidationSignals17BlockDisconnectedERKNSt3__110shared_ptrIK6CBlockEEPK11CBlockIndexENK3$_0clEvEUlR20CValidationInterfaceE_EEvOT_
validationinterface.cpp:_ZN21ValidationSignalsImpl7IterateIZZN17ValidationSignals17ChainStateFlushedE14ChainstateRoleRK13CBlockLocatorENK3$_0clEvEUlR20CValidationInterfaceE_EEvOT_
Line
Count
Source
81
670
    {
82
670
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
670
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
83
1.34k
        for (auto it = m_list.begin(); it != m_list.end();) {
84
670
            ++it->count;
85
670
            {
86
670
                REVERSE_LOCK(lock);
Line
Count
Source
243
670
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
670
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
670
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
670
#define PASTE(x, y) x ## y
87
670
                f(*it->callbacks);
88
670
            }
89
670
            it = --it->count ? std::next(it) : 
m_list.erase(it)0
;
90
670
        }
91
670
    }
validationinterface.cpp:_ZN21ValidationSignalsImpl7IterateIZN17ValidationSignals12BlockCheckedERK6CBlockRK20BlockValidationStateE3$_0EEvOT_
Line
Count
Source
81
1.10k
    {
82
1.10k
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
1.10k
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
83
2.21k
        for (auto it = m_list.begin(); it != m_list.end();) {
84
1.10k
            ++it->count;
85
1.10k
            {
86
1.10k
                REVERSE_LOCK(lock);
Line
Count
Source
243
1.10k
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
1.10k
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
1.10k
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
1.10k
#define PASTE(x, y) x ## y
87
1.10k
                f(*it->callbacks);
88
1.10k
            }
89
1.10k
            it = --it->count ? std::next(it) : 
m_list.erase(it)0
;
90
1.10k
        }
91
1.10k
    }
validationinterface.cpp:_ZN21ValidationSignalsImpl7IterateIZN17ValidationSignals16NewPoWValidBlockEPK11CBlockIndexRKNSt3__110shared_ptrIK6CBlockEEE3$_0EEvOT_
Line
Count
Source
81
857
    {
82
857
        WAIT_LOCK(m_mutex, lock);
Line
Count
Source
262
857
#define WAIT_LOCK(cs, name) UniqueLock name(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
83
1.71k
        for (auto it = m_list.begin(); it != m_list.end();) {
84
857
            ++it->count;
85
857
            {
86
857
                REVERSE_LOCK(lock);
Line
Count
Source
243
857
#define REVERSE_LOCK(g) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, #g, __FILE__, __LINE__)
Line
Count
Source
11
857
#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
Line
Count
Source
9
857
#define PASTE2(x, y) PASTE(x, y)
Line
Count
Source
8
857
#define PASTE(x, y) x ## y
87
857
                f(*it->callbacks);
88
857
            }
89
857
            it = --it->count ? std::next(it) : 
m_list.erase(it)0
;
90
857
        }
91
857
    }
92
};
93
94
ValidationSignals::ValidationSignals(std::unique_ptr<util::TaskRunnerInterface> task_runner)
95
7.28k
    : m_internals{std::make_unique<ValidationSignalsImpl>(std::move(task_runner))} {}
96
97
7.28k
ValidationSignals::~ValidationSignals() = default;
98
99
void ValidationSignals::FlushBackgroundCallbacks()
100
7.28k
{
101
7.28k
    m_internals->m_task_runner->flush();
102
7.28k
}
103
104
size_t ValidationSignals::CallbacksPending()
105
8.69k
{
106
8.69k
    return m_internals->m_task_runner->size();
107
8.69k
}
108
109
void ValidationSignals::RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks)
110
7.28k
{
111
    // Each connection captures the shared_ptr to ensure that each callback is
112
    // executed before the subscriber is destroyed. For more details see #18338.
113
7.28k
    m_internals->Register(std::move(callbacks));
114
7.28k
}
115
116
void ValidationSignals::RegisterValidationInterface(CValidationInterface* callbacks)
117
7.28k
{
118
    // Create a shared_ptr with a no-op deleter - CValidationInterface lifecycle
119
    // is managed by the caller.
120
7.28k
    RegisterSharedValidationInterface({callbacks, [](CValidationInterface*){}});
121
7.28k
}
122
123
void ValidationSignals::UnregisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks)
124
0
{
125
0
    UnregisterValidationInterface(callbacks.get());
126
0
}
127
128
void ValidationSignals::UnregisterValidationInterface(CValidationInterface* callbacks)
129
0
{
130
0
    m_internals->Unregister(callbacks);
131
0
}
132
133
void ValidationSignals::UnregisterAllValidationInterfaces()
134
0
{
135
0
    m_internals->Clear();
136
0
}
137
138
void ValidationSignals::CallFunctionInValidationInterfaceQueue(std::function<void()> func)
139
14.5k
{
140
14.5k
    m_internals->m_task_runner->insert(std::move(func));
141
14.5k
}
142
143
void ValidationSignals::SyncWithValidationInterfaceQueue()
144
14.5k
{
145
14.5k
    AssertLockNotHeld(cs_main);
Line
Count
Source
147
14.5k
#define AssertLockNotHeld(cs) AssertLockNotHeldInline(#cs, __FILE__, __LINE__, &cs)
146
    // Block until the validation queue drains
147
14.5k
    std::promise<void> promise;
148
14.5k
    CallFunctionInValidationInterfaceQueue([&promise] {
149
14.5k
        promise.set_value();
150
14.5k
    });
151
14.5k
    promise.get_future().wait();
152
14.5k
}
153
154
// Use a macro instead of a function for conditional logging to prevent
155
// evaluating arguments when logging is not enabled.
156
//
157
// NOTE: The lambda captures all local variables by value.
158
#define ENQUEUE_AND_LOG_EVENT(event, fmt, name, ...)           \
159
15.9k
    do {                                                       \
160
15.9k
        auto local_name = (name);                              \
161
15.9k
        LOG_EVENT("Enqueuing " fmt, local_name, __VA_ARGS__);  \
162
15.9k
        m_internals->m_task_runner->insert([=] { \
163
15.9k
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
782
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
782
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
782
    do {                                                  \
274
782
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
782
    } while (0)
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
10.4k
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
10.4k
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
10.4k
    do {                                                  \
274
10.4k
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
10.4k
    } while (0)
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
2.49k
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
2.49k
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
2.49k
    do {                                                  \
274
2.49k
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
2.49k
    } while (0)
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
782
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
782
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
782
    do {                                                  \
274
782
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
782
    } while (0)
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
782
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
782
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
782
    do {                                                  \
274
782
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
782
    } while (0)
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
0
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
0
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
0
    do {                                                  \
274
0
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
0
    } while (0)
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
670
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
670
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
670
    do {                                                  \
274
670
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
670
    } while (0)
164
15.9k
            event();                                           \
165
15.9k
        });                                                    \
validationinterface.cpp:_ZZN17ValidationSignals15UpdatedBlockTipEPK11CBlockIndexS2_bENK3$_1clEv
Line
Count
Source
162
782
        m_internals->m_task_runner->insert([=] { \
163
782
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
782
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
782
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
782
    do {                                                  \
274
782
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
782
    } while (0)
164
782
            event();                                           \
165
782
        });                                                    \
validationinterface.cpp:_ZZN17ValidationSignals25TransactionAddedToMempoolERK25NewMempoolTransactionInfoyENK3$_1clEv
Line
Count
Source
162
10.4k
        m_internals->m_task_runner->insert([=] { \
163
10.4k
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
10.4k
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
10.4k
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
10.4k
    do {                                                  \
274
10.4k
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
10.4k
    } while (0)
164
10.4k
            event();                                           \
165
10.4k
        });                                                    \
validationinterface.cpp:_ZZN17ValidationSignals29TransactionRemovedFromMempoolERKNSt3__110shared_ptrIK12CTransactionEE20MemPoolRemovalReasonyENK3$_1clEv
Line
Count
Source
162
2.49k
        m_internals->m_task_runner->insert([=] { \
163
2.49k
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
2.49k
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
2.49k
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
2.49k
    do {                                                  \
274
2.49k
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
2.49k
    } while (0)
164
2.49k
            event();                                           \
165
2.49k
        });                                                    \
validationinterface.cpp:_ZZN17ValidationSignals14BlockConnectedE14ChainstateRoleRKNSt3__110shared_ptrIK6CBlockEEPK11CBlockIndexENK3$_1clEv
Line
Count
Source
162
782
        m_internals->m_task_runner->insert([=] { \
163
782
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
782
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
782
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
782
    do {                                                  \
274
782
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
782
    } while (0)
164
782
            event();                                           \
165
782
        });                                                    \
validationinterface.cpp:_ZZN17ValidationSignals34MempoolTransactionsRemovedForBlockERKNSt3__16vectorI29RemovedMempoolTransactionInfoNS0_9allocatorIS2_EEEEjENK3$_1clEv
Line
Count
Source
162
782
        m_internals->m_task_runner->insert([=] { \
163
782
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
782
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
782
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
782
    do {                                                  \
274
782
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
782
    } while (0)
164
782
            event();                                           \
165
782
        });                                                    \
Unexecuted instantiation: validationinterface.cpp:_ZZN17ValidationSignals17BlockDisconnectedERKNSt3__110shared_ptrIK6CBlockEEPK11CBlockIndexENK3$_1clEv
validationinterface.cpp:_ZZN17ValidationSignals17ChainStateFlushedE14ChainstateRoleRK13CBlockLocatorENK3$_1clEv
Line
Count
Source
162
670
        m_internals->m_task_runner->insert([=] { \
163
670
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
Line
Count
Source
169
670
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
670
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
670
    do {                                                  \
274
670
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
670
    } while (0)
164
670
            event();                                           \
165
670
        });                                                    \
166
15.9k
    } while (0)
167
168
#define LOG_EVENT(fmt, ...) \
169
34.9k
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
170
171
782
void ValidationSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
172
    // Dependencies exist that require UpdatedBlockTip events to be delivered in the order in which
173
    // the chain actually updates. One way to ensure this is for the caller to invoke this signal
174
    // in the same critical section where the chain is updated
175
176
782
    auto event = [pindexNew, pindexFork, fInitialDownload, this] {
177
782
        m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.UpdatedBlockTip(pindexNew, pindexFork, fInitialDownload); });
178
782
    };
179
782
    ENQUEUE_AND_LOG_EVENT(event, "%s: new block hash=%s fork block hash=%s (in IBD=%s)", __func__,
Line
Count
Source
159
782
    do {                                                       \
160
782
        auto local_name = (name);                              \
161
782
        LOG_EVENT("Enqueuing " fmt, local_name, __VA_ARGS__);  \
Line
Count
Source
169
782
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
782
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
782
    do {                                                  \
274
782
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
782
    } while (0)
162
782
        m_internals->m_task_runner->insert([=] { \
163
782
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
164
782
            event();                                           \
165
782
        });                                                    \
166
782
    } while (0)
180
782
                          pindexNew->GetBlockHash().ToString(),
181
782
                          pindexFork ? pindexFork->GetBlockHash().ToString() : "null",
182
782
                          fInitialDownload);
183
782
}
184
185
void ValidationSignals::ActiveTipChange(const CBlockIndex& new_tip, bool is_ibd)
186
1.07k
{
187
1.07k
    LOG_EVENT("%s: new block hash=%s block height=%d", __func__, new_tip.GetBlockHash().ToString(), new_tip.nHeight);
Line
Count
Source
169
1.07k
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
1.07k
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
1.07k
    do {                                                  \
274
1.07k
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
1.07k
    } while (0)
188
1.07k
    m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.ActiveTipChange(new_tip, is_ibd); });
189
1.07k
}
190
191
void ValidationSignals::TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence)
192
10.4k
{
193
10.4k
    auto event = [tx, mempool_sequence, this] {
194
10.4k
        m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.TransactionAddedToMempool(tx, mempool_sequence); });
195
10.4k
    };
196
10.4k
    ENQUEUE_AND_LOG_EVENT(event, "%s: txid=%s wtxid=%s", __func__,
Line
Count
Source
159
10.4k
    do {                                                       \
160
10.4k
        auto local_name = (name);                              \
161
10.4k
        LOG_EVENT("Enqueuing " fmt, local_name, __VA_ARGS__);  \
Line
Count
Source
169
10.4k
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
10.4k
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
10.4k
    do {                                                  \
274
10.4k
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
10.4k
    } while (0)
162
10.4k
        m_internals->m_task_runner->insert([=] { \
163
10.4k
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
164
10.4k
            event();                                           \
165
10.4k
        });                                                    \
166
10.4k
    } while (0)
197
10.4k
                          tx.info.m_tx->GetHash().ToString(),
198
10.4k
                          tx.info.m_tx->GetWitnessHash().ToString());
199
10.4k
}
200
201
2.49k
void ValidationSignals::TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t mempool_sequence) {
202
2.49k
    auto event = [tx, reason, mempool_sequence, this] {
203
2.49k
        m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.TransactionRemovedFromMempool(tx, reason, mempool_sequence); });
204
2.49k
    };
205
2.49k
    ENQUEUE_AND_LOG_EVENT(event, "%s: txid=%s wtxid=%s reason=%s", __func__,
Line
Count
Source
159
2.49k
    do {                                                       \
160
2.49k
        auto local_name = (name);                              \
161
2.49k
        LOG_EVENT("Enqueuing " fmt, local_name, __VA_ARGS__);  \
Line
Count
Source
169
2.49k
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
2.49k
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
2.49k
    do {                                                  \
274
2.49k
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
2.49k
    } while (0)
162
2.49k
        m_internals->m_task_runner->insert([=] { \
163
2.49k
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
164
2.49k
            event();                                           \
165
2.49k
        });                                                    \
166
2.49k
    } while (0)
206
2.49k
                          tx->GetHash().ToString(),
207
2.49k
                          tx->GetWitnessHash().ToString(),
208
2.49k
                          RemovalReasonToString(reason));
209
2.49k
}
210
211
782
void ValidationSignals::BlockConnected(ChainstateRole role, const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex) {
212
782
    auto event = [role, pblock, pindex, this] {
213
782
        m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.BlockConnected(role, pblock, pindex); });
214
782
    };
215
782
    ENQUEUE_AND_LOG_EVENT(event, "%s: block hash=%s block height=%d", __func__,
Line
Count
Source
159
782
    do {                                                       \
160
782
        auto local_name = (name);                              \
161
782
        LOG_EVENT("Enqueuing " fmt, local_name, __VA_ARGS__);  \
Line
Count
Source
169
782
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
782
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
782
    do {                                                  \
274
782
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
782
    } while (0)
162
782
        m_internals->m_task_runner->insert([=] { \
163
782
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
164
782
            event();                                           \
165
782
        });                                                    \
166
782
    } while (0)
216
782
                          pblock->GetHash().ToString(),
217
782
                          pindex->nHeight);
218
782
}
219
220
void ValidationSignals::MempoolTransactionsRemovedForBlock(const std::vector<RemovedMempoolTransactionInfo>& txs_removed_for_block, unsigned int nBlockHeight)
221
782
{
222
782
    auto event = [txs_removed_for_block, nBlockHeight, this] {
223
782
        m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.MempoolTransactionsRemovedForBlock(txs_removed_for_block, nBlockHeight); });
224
782
    };
225
782
    ENQUEUE_AND_LOG_EVENT(event, "%s: block height=%s txs removed=%s", __func__,
Line
Count
Source
159
782
    do {                                                       \
160
782
        auto local_name = (name);                              \
161
782
        LOG_EVENT("Enqueuing " fmt, local_name, __VA_ARGS__);  \
Line
Count
Source
169
782
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
782
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
782
    do {                                                  \
274
782
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
782
    } while (0)
162
782
        m_internals->m_task_runner->insert([=] { \
163
782
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
164
782
            event();                                           \
165
782
        });                                                    \
166
782
    } while (0)
226
782
                          nBlockHeight,
227
782
                          txs_removed_for_block.size());
228
782
}
229
230
void ValidationSignals::BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex)
231
0
{
232
0
    auto event = [pblock, pindex, this] {
233
0
        m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.BlockDisconnected(pblock, pindex); });
234
0
    };
235
0
    ENQUEUE_AND_LOG_EVENT(event, "%s: block hash=%s block height=%d", __func__,
Line
Count
Source
159
0
    do {                                                       \
160
0
        auto local_name = (name);                              \
161
0
        LOG_EVENT("Enqueuing " fmt, local_name, __VA_ARGS__);  \
Line
Count
Source
169
0
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
0
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
0
    do {                                                  \
274
0
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
0
    } while (0)
162
0
        m_internals->m_task_runner->insert([=] { \
163
0
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
164
0
            event();                                           \
165
0
        });                                                    \
166
0
    } while (0)
236
0
                          pblock->GetHash().ToString(),
237
0
                          pindex->nHeight);
238
0
}
239
240
670
void ValidationSignals::ChainStateFlushed(ChainstateRole role, const CBlockLocator &locator) {
241
670
    auto event = [role, locator, this] {
242
670
        m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.ChainStateFlushed(role, locator); });
243
670
    };
244
670
    ENQUEUE_AND_LOG_EVENT(event, "%s: block hash=%s", __func__,
Line
Count
Source
159
670
    do {                                                       \
160
670
        auto local_name = (name);                              \
161
670
        LOG_EVENT("Enqueuing " fmt, local_name, __VA_ARGS__);  \
Line
Count
Source
169
670
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
670
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
670
    do {                                                  \
274
670
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
670
    } while (0)
162
670
        m_internals->m_task_runner->insert([=] { \
163
670
            LOG_EVENT(fmt, local_name, __VA_ARGS__);           \
164
670
            event();                                           \
165
670
        });                                                    \
166
670
    } while (0)
245
670
                          locator.IsNull() ? "null" : locator.vHave.front().ToString());
246
670
}
247
248
1.10k
void ValidationSignals::BlockChecked(const CBlock& block, const BlockValidationState& state) {
249
1.10k
    LOG_EVENT("%s: block hash=%s state=%s", __func__,
Line
Count
Source
169
1.10k
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
1.10k
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
1.10k
    do {                                                  \
274
1.10k
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
1.10k
    } while (0)
250
1.10k
              block.GetHash().ToString(), state.ToString());
251
1.10k
    m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.BlockChecked(block, state); });
252
1.10k
}
253
254
857
void ValidationSignals::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock> &block) {
255
857
    LOG_EVENT("%s: block hash=%s", __func__, block->GetHash().ToString());
Line
Count
Source
169
857
    LogDebug(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
Line
Count
Source
280
857
#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
Line
Count
Source
273
857
    do {                                                  \
274
857
        if (LogAcceptCategory((category), (level))) {     \
275
0
            LogPrintLevel_(category, level, __VA_ARGS__); \
Line
Count
Source
255
0
#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
276
0
        }                                                 \
277
857
    } while (0)
256
857
    m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NewPoWValidBlock(pindex, block); });
257
857
}