1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2016 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.
6 #include "validationinterface.h"
15 #include <boost/signals2/signal.hpp>
17 struct MainSignalsInstance
{
18 boost::signals2::signal
<void (const CBlockIndex
*, const CBlockIndex
*, bool fInitialDownload
)> UpdatedBlockTip
;
19 boost::signals2::signal
<void (const CTransactionRef
&)> TransactionAddedToMempool
;
20 boost::signals2::signal
<void (const std::shared_ptr
<const CBlock
> &, const CBlockIndex
*pindex
, const std::vector
<CTransactionRef
>&)> BlockConnected
;
21 boost::signals2::signal
<void (const std::shared_ptr
<const CBlock
> &)> BlockDisconnected
;
22 boost::signals2::signal
<void (const CBlockLocator
&)> SetBestChain
;
23 boost::signals2::signal
<void (const uint256
&)> Inventory
;
24 boost::signals2::signal
<void (int64_t nBestBlockTime
, CConnman
* connman
)> Broadcast
;
25 boost::signals2::signal
<void (const CBlock
&, const CValidationState
&)> BlockChecked
;
26 boost::signals2::signal
<void (const CBlockIndex
*, const std::shared_ptr
<const CBlock
>&)> NewPoWValidBlock
;
28 // We are not allowed to assume the scheduler only runs in one thread,
29 // but must ensure all callbacks happen in-order, so we end up creating
30 // our own queue here :(
31 SingleThreadedSchedulerClient m_schedulerClient
;
33 MainSignalsInstance(CScheduler
*pscheduler
) : m_schedulerClient(pscheduler
) {}
36 static CMainSignals g_signals
;
38 void CMainSignals::RegisterBackgroundSignalScheduler(CScheduler
& scheduler
) {
40 m_internals
.reset(new MainSignalsInstance(&scheduler
));
43 void CMainSignals::UnregisterBackgroundSignalScheduler() {
44 m_internals
.reset(nullptr);
47 void CMainSignals::FlushBackgroundCallbacks() {
48 m_internals
->m_schedulerClient
.EmptyQueue();
51 CMainSignals
& GetMainSignals()
56 void RegisterValidationInterface(CValidationInterface
* pwalletIn
) {
57 g_signals
.m_internals
->UpdatedBlockTip
.connect(boost::bind(&CValidationInterface::UpdatedBlockTip
, pwalletIn
, _1
, _2
, _3
));
58 g_signals
.m_internals
->TransactionAddedToMempool
.connect(boost::bind(&CValidationInterface::TransactionAddedToMempool
, pwalletIn
, _1
));
59 g_signals
.m_internals
->BlockConnected
.connect(boost::bind(&CValidationInterface::BlockConnected
, pwalletIn
, _1
, _2
, _3
));
60 g_signals
.m_internals
->BlockDisconnected
.connect(boost::bind(&CValidationInterface::BlockDisconnected
, pwalletIn
, _1
));
61 g_signals
.m_internals
->SetBestChain
.connect(boost::bind(&CValidationInterface::SetBestChain
, pwalletIn
, _1
));
62 g_signals
.m_internals
->Inventory
.connect(boost::bind(&CValidationInterface::Inventory
, pwalletIn
, _1
));
63 g_signals
.m_internals
->Broadcast
.connect(boost::bind(&CValidationInterface::ResendWalletTransactions
, pwalletIn
, _1
, _2
));
64 g_signals
.m_internals
->BlockChecked
.connect(boost::bind(&CValidationInterface::BlockChecked
, pwalletIn
, _1
, _2
));
65 g_signals
.m_internals
->NewPoWValidBlock
.connect(boost::bind(&CValidationInterface::NewPoWValidBlock
, pwalletIn
, _1
, _2
));
68 void UnregisterValidationInterface(CValidationInterface
* pwalletIn
) {
69 g_signals
.m_internals
->BlockChecked
.disconnect(boost::bind(&CValidationInterface::BlockChecked
, pwalletIn
, _1
, _2
));
70 g_signals
.m_internals
->Broadcast
.disconnect(boost::bind(&CValidationInterface::ResendWalletTransactions
, pwalletIn
, _1
, _2
));
71 g_signals
.m_internals
->Inventory
.disconnect(boost::bind(&CValidationInterface::Inventory
, pwalletIn
, _1
));
72 g_signals
.m_internals
->SetBestChain
.disconnect(boost::bind(&CValidationInterface::SetBestChain
, pwalletIn
, _1
));
73 g_signals
.m_internals
->TransactionAddedToMempool
.disconnect(boost::bind(&CValidationInterface::TransactionAddedToMempool
, pwalletIn
, _1
));
74 g_signals
.m_internals
->BlockConnected
.disconnect(boost::bind(&CValidationInterface::BlockConnected
, pwalletIn
, _1
, _2
, _3
));
75 g_signals
.m_internals
->BlockDisconnected
.disconnect(boost::bind(&CValidationInterface::BlockDisconnected
, pwalletIn
, _1
));
76 g_signals
.m_internals
->UpdatedBlockTip
.disconnect(boost::bind(&CValidationInterface::UpdatedBlockTip
, pwalletIn
, _1
, _2
, _3
));
77 g_signals
.m_internals
->NewPoWValidBlock
.disconnect(boost::bind(&CValidationInterface::NewPoWValidBlock
, pwalletIn
, _1
, _2
));
80 void UnregisterAllValidationInterfaces() {
81 g_signals
.m_internals
->BlockChecked
.disconnect_all_slots();
82 g_signals
.m_internals
->Broadcast
.disconnect_all_slots();
83 g_signals
.m_internals
->Inventory
.disconnect_all_slots();
84 g_signals
.m_internals
->SetBestChain
.disconnect_all_slots();
85 g_signals
.m_internals
->TransactionAddedToMempool
.disconnect_all_slots();
86 g_signals
.m_internals
->BlockConnected
.disconnect_all_slots();
87 g_signals
.m_internals
->BlockDisconnected
.disconnect_all_slots();
88 g_signals
.m_internals
->UpdatedBlockTip
.disconnect_all_slots();
89 g_signals
.m_internals
->NewPoWValidBlock
.disconnect_all_slots();
92 void CMainSignals::UpdatedBlockTip(const CBlockIndex
*pindexNew
, const CBlockIndex
*pindexFork
, bool fInitialDownload
) {
93 m_internals
->UpdatedBlockTip(pindexNew
, pindexFork
, fInitialDownload
);
96 void CMainSignals::TransactionAddedToMempool(const CTransactionRef
&ptx
) {
97 m_internals
->TransactionAddedToMempool(ptx
);
100 void CMainSignals::BlockConnected(const std::shared_ptr
<const CBlock
> &pblock
, const CBlockIndex
*pindex
, const std::vector
<CTransactionRef
>& vtxConflicted
) {
101 m_internals
->BlockConnected(pblock
, pindex
, vtxConflicted
);
104 void CMainSignals::BlockDisconnected(const std::shared_ptr
<const CBlock
> &pblock
) {
105 m_internals
->BlockDisconnected(pblock
);
108 void CMainSignals::SetBestChain(const CBlockLocator
&locator
) {
109 m_internals
->SetBestChain(locator
);
112 void CMainSignals::Inventory(const uint256
&hash
) {
113 m_internals
->Inventory(hash
);
116 void CMainSignals::Broadcast(int64_t nBestBlockTime
, CConnman
* connman
) {
117 m_internals
->Broadcast(nBestBlockTime
, connman
);
120 void CMainSignals::BlockChecked(const CBlock
& block
, const CValidationState
& state
) {
121 m_internals
->BlockChecked(block
, state
);
124 void CMainSignals::NewPoWValidBlock(const CBlockIndex
*pindex
, const std::shared_ptr
<const CBlock
> &block
) {
125 m_internals
->NewPoWValidBlock(pindex
, block
);