99#include " primitives/block.h"
1010#include " scheduler.h"
1111#include " sync.h"
12+ #include " txmempool.h"
1213#include " util.h"
1314
1415#include < list>
@@ -21,6 +22,7 @@ struct MainSignalsInstance {
2122 boost::signals2::signal<void (const CTransactionRef &, int64_t )> TransactionAddedToMempool;
2223 boost::signals2::signal<void (const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex, const std::vector<CTransactionRef>&)> BlockConnected;
2324 boost::signals2::signal<void (const std::shared_ptr<const CBlock> &, const CBlockIndex* pindexDisconnected)> BlockDisconnected;
25+ boost::signals2::signal<void (const CTransactionRef &)> TransactionRemovedFromMempool;
2426 boost::signals2::signal<void (const CBlockLocator &)> SetBestChain;
2527 boost::signals2::signal<void (const uint256 &)> Inventory;
2628 boost::signals2::signal<void (int64_t nBestBlockTime, CConnman* connman)> Broadcast;
@@ -59,6 +61,14 @@ void CMainSignals::FlushBackgroundCallbacks() {
5961 }
6062}
6163
64+ void CMainSignals::RegisterWithMempoolSignals (CTxMemPool& pool) {
65+ pool.NotifyEntryRemoved .connect (boost::bind (&CMainSignals::MempoolEntryRemoved, this , _1, _2));
66+ }
67+
68+ void CMainSignals::UnregisterWithMempoolSignals (CTxMemPool& pool) {
69+ pool.NotifyEntryRemoved .disconnect (boost::bind (&CMainSignals::MempoolEntryRemoved, this , _1, _2));
70+ }
71+
6272CMainSignals& GetMainSignals ()
6373{
6474 return g_signals;
@@ -73,6 +83,7 @@ void RegisterValidationInterface(CValidationInterface* pwalletIn) {
7383 g_signals.m_internals ->BlockDisconnected .connect (boost::bind (&CValidationInterface::BlockDisconnected, pwalletIn, _1, _2));
7484 g_signals.m_internals ->NotifyTransactionLock .connect (boost::bind (&CValidationInterface::NotifyTransactionLock, pwalletIn, _1, _2));
7585 g_signals.m_internals ->NotifyChainLock .connect (boost::bind (&CValidationInterface::NotifyChainLock, pwalletIn, _1, _2));
86+ g_signals.m_internals ->TransactionRemovedFromMempool .connect (boost::bind (&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, _1));
7687 g_signals.m_internals ->SetBestChain .connect (boost::bind (&CValidationInterface::SetBestChain, pwalletIn, _1));
7788 g_signals.m_internals ->Inventory .connect (boost::bind (&CValidationInterface::Inventory, pwalletIn, _1));
7889 g_signals.m_internals ->Broadcast .connect (boost::bind (&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
@@ -94,6 +105,7 @@ void UnregisterValidationInterface(CValidationInterface* pwalletIn) {
94105 g_signals.m_internals ->TransactionAddedToMempool .disconnect (boost::bind (&CValidationInterface::TransactionAddedToMempool, pwalletIn, _1, _2));
95106 g_signals.m_internals ->BlockConnected .disconnect (boost::bind (&CValidationInterface::BlockConnected, pwalletIn, _1, _2, _3));
96107 g_signals.m_internals ->BlockDisconnected .disconnect (boost::bind (&CValidationInterface::BlockDisconnected, pwalletIn, _1, _2));
108+ g_signals.m_internals ->TransactionRemovedFromMempool .disconnect (boost::bind (&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, _1));
97109 g_signals.m_internals ->UpdatedBlockTip .disconnect (boost::bind (&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3));
98110 g_signals.m_internals ->NewPoWValidBlock .disconnect (boost::bind (&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
99111 g_signals.m_internals ->NotifyHeaderTip .disconnect (boost::bind (&CValidationInterface::NotifyHeaderTip, pwalletIn, _1, _2));
@@ -117,6 +129,7 @@ void UnregisterAllValidationInterfaces() {
117129 g_signals.m_internals ->TransactionAddedToMempool .disconnect_all_slots ();
118130 g_signals.m_internals ->BlockConnected .disconnect_all_slots ();
119131 g_signals.m_internals ->BlockDisconnected .disconnect_all_slots ();
132+ g_signals.m_internals ->TransactionRemovedFromMempool .disconnect_all_slots ();
120133 g_signals.m_internals ->UpdatedBlockTip .disconnect_all_slots ();
121134 g_signals.m_internals ->NewPoWValidBlock .disconnect_all_slots ();
122135 g_signals.m_internals ->NotifyHeaderTip .disconnect_all_slots ();
@@ -127,28 +140,52 @@ void UnregisterAllValidationInterfaces() {
127140 g_signals.m_internals ->NotifyMasternodeListChanged .disconnect_all_slots ();
128141}
129142
143+ void CallFunctionInValidationInterfaceQueue (std::function<void ()> func) {
144+ g_signals.m_internals ->m_schedulerClient .AddToProcessQueue (std::move (func));
145+ }
146+
147+ void CMainSignals::MempoolEntryRemoved (CTransactionRef ptx, MemPoolRemovalReason reason) {
148+ if (reason != MemPoolRemovalReason::BLOCK && reason != MemPoolRemovalReason::CONFLICT) {
149+ m_internals->m_schedulerClient .AddToProcessQueue ([ptx, this ] {
150+ m_internals->TransactionRemovedFromMempool (ptx);
151+ });
152+ }
153+ }
154+
130155void CMainSignals::UpdatedBlockTip (const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload ) {
131- m_internals->UpdatedBlockTip (pindexNew, pindexFork, fInitialDownload );
156+ m_internals->m_schedulerClient .AddToProcessQueue ([pindexNew, pindexFork, fInitialDownload , this ] {
157+ m_internals->UpdatedBlockTip (pindexNew, pindexFork, fInitialDownload );
158+ });
132159}
133160
134161void CMainSignals::TransactionAddedToMempool (const CTransactionRef &ptx, int64_t nAcceptTime) {
135- m_internals->TransactionAddedToMempool (ptx, nAcceptTime);
162+ m_internals->m_schedulerClient .AddToProcessQueue ([ptx, this ] {
163+ m_internals->TransactionAddedToMempool (ptx, nAcceptTime);
164+ });
136165}
137166
138- void CMainSignals::BlockConnected (const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex, const std::vector<CTransactionRef>& vtxConflicted) {
139- m_internals->BlockConnected (pblock, pindex, vtxConflicted);
167+ void CMainSignals::BlockConnected (const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex, const std::shared_ptr<const std::vector<CTransactionRef>>& pvtxConflicted) {
168+ m_internals->m_schedulerClient .AddToProcessQueue ([pblock, pindex, pvtxConflicted, this ] {
169+ m_internals->BlockConnected (pblock, pindex, *pvtxConflicted);
170+ });
140171}
141172
142173void CMainSignals::BlockDisconnected (const std::shared_ptr<const CBlock> &pblock, const CBlockIndex* pindexDisconnected) {
143- m_internals->BlockDisconnected (pblock, pindexDisconnected);
174+ m_internals->m_schedulerClient .AddToProcessQueue ([pblock, this ] {
175+ m_internals->BlockDisconnected (pblock, pindexDisconnected);
176+ });
144177}
145178
146179void CMainSignals::SetBestChain (const CBlockLocator &locator) {
147- m_internals->SetBestChain (locator);
180+ m_internals->m_schedulerClient .AddToProcessQueue ([locator, this ] {
181+ m_internals->SetBestChain (locator);
182+ });
148183}
149184
150185void CMainSignals::Inventory (const uint256 &hash) {
151- m_internals->Inventory (hash);
186+ m_internals->m_schedulerClient .AddToProcessQueue ([hash, this ] {
187+ m_internals->Inventory (hash);
188+ });
152189}
153190
154191void CMainSignals::Broadcast (int64_t nBestBlockTime, CConnman* connman) {
0 commit comments