Make ValidationInterface signals-type-agnostic
(by hiding boost::signals stuff in the .cpp) This allows us to give it a bit more intelligence as we move forward, including routing some signals through CScheduler. While the introduction of a "internals" pointer in the class is pretty ugly, the fact that we no longer need to include boost/signals directly from validationinterface.h is very much worth the loss.
This commit is contained in:
parent
ff6a834fc3
commit
3a19fed9db
2 changed files with 117 additions and 53 deletions
|
@ -5,45 +5,99 @@
|
||||||
|
|
||||||
#include "validationinterface.h"
|
#include "validationinterface.h"
|
||||||
|
|
||||||
|
#include <boost/signals2/signal.hpp>
|
||||||
|
|
||||||
|
struct MainSignalsInstance {
|
||||||
|
boost::signals2::signal<void (const CBlockIndex *, const CBlockIndex *, bool fInitialDownload)> UpdatedBlockTip;
|
||||||
|
boost::signals2::signal<void (const CTransactionRef &)> TransactionAddedToMempool;
|
||||||
|
boost::signals2::signal<void (const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex, const std::vector<CTransactionRef>&)> BlockConnected;
|
||||||
|
boost::signals2::signal<void (const std::shared_ptr<const CBlock> &)> BlockDisconnected;
|
||||||
|
boost::signals2::signal<void (const CBlockLocator &)> SetBestChain;
|
||||||
|
boost::signals2::signal<void (const uint256 &)> Inventory;
|
||||||
|
boost::signals2::signal<void (int64_t nBestBlockTime, CConnman* connman)> Broadcast;
|
||||||
|
boost::signals2::signal<void (const CBlock&, const CValidationState&)> BlockChecked;
|
||||||
|
boost::signals2::signal<void (const CBlockIndex *, const std::shared_ptr<const CBlock>&)> NewPoWValidBlock;
|
||||||
|
};
|
||||||
|
|
||||||
static CMainSignals g_signals;
|
static CMainSignals g_signals;
|
||||||
|
|
||||||
|
CMainSignals::CMainSignals() {
|
||||||
|
m_internals.reset(new MainSignalsInstance());
|
||||||
|
}
|
||||||
|
|
||||||
CMainSignals& GetMainSignals()
|
CMainSignals& GetMainSignals()
|
||||||
{
|
{
|
||||||
return g_signals;
|
return g_signals;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegisterValidationInterface(CValidationInterface* pwalletIn) {
|
void RegisterValidationInterface(CValidationInterface* pwalletIn) {
|
||||||
g_signals.UpdatedBlockTip.connect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3));
|
g_signals.m_internals->UpdatedBlockTip.connect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3));
|
||||||
g_signals.TransactionAddedToMempool.connect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, _1));
|
g_signals.m_internals->TransactionAddedToMempool.connect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, _1));
|
||||||
g_signals.BlockConnected.connect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, _1, _2, _3));
|
g_signals.m_internals->BlockConnected.connect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, _1, _2, _3));
|
||||||
g_signals.BlockDisconnected.connect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, _1));
|
g_signals.m_internals->BlockDisconnected.connect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, _1));
|
||||||
g_signals.SetBestChain.connect(boost::bind(&CValidationInterface::SetBestChain, pwalletIn, _1));
|
g_signals.m_internals->SetBestChain.connect(boost::bind(&CValidationInterface::SetBestChain, pwalletIn, _1));
|
||||||
g_signals.Inventory.connect(boost::bind(&CValidationInterface::Inventory, pwalletIn, _1));
|
g_signals.m_internals->Inventory.connect(boost::bind(&CValidationInterface::Inventory, pwalletIn, _1));
|
||||||
g_signals.Broadcast.connect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
|
g_signals.m_internals->Broadcast.connect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
|
||||||
g_signals.BlockChecked.connect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
|
g_signals.m_internals->BlockChecked.connect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
|
||||||
g_signals.NewPoWValidBlock.connect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
|
g_signals.m_internals->NewPoWValidBlock.connect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnregisterValidationInterface(CValidationInterface* pwalletIn) {
|
void UnregisterValidationInterface(CValidationInterface* pwalletIn) {
|
||||||
g_signals.BlockChecked.disconnect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
|
g_signals.m_internals->BlockChecked.disconnect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
|
||||||
g_signals.Broadcast.disconnect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
|
g_signals.m_internals->Broadcast.disconnect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
|
||||||
g_signals.Inventory.disconnect(boost::bind(&CValidationInterface::Inventory, pwalletIn, _1));
|
g_signals.m_internals->Inventory.disconnect(boost::bind(&CValidationInterface::Inventory, pwalletIn, _1));
|
||||||
g_signals.SetBestChain.disconnect(boost::bind(&CValidationInterface::SetBestChain, pwalletIn, _1));
|
g_signals.m_internals->SetBestChain.disconnect(boost::bind(&CValidationInterface::SetBestChain, pwalletIn, _1));
|
||||||
g_signals.TransactionAddedToMempool.disconnect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, _1));
|
g_signals.m_internals->TransactionAddedToMempool.disconnect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, _1));
|
||||||
g_signals.BlockConnected.disconnect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, _1, _2, _3));
|
g_signals.m_internals->BlockConnected.disconnect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, _1, _2, _3));
|
||||||
g_signals.BlockDisconnected.disconnect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, _1));
|
g_signals.m_internals->BlockDisconnected.disconnect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, _1));
|
||||||
g_signals.UpdatedBlockTip.disconnect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3));
|
g_signals.m_internals->UpdatedBlockTip.disconnect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3));
|
||||||
g_signals.NewPoWValidBlock.disconnect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
|
g_signals.m_internals->NewPoWValidBlock.disconnect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnregisterAllValidationInterfaces() {
|
void UnregisterAllValidationInterfaces() {
|
||||||
g_signals.BlockChecked.disconnect_all_slots();
|
g_signals.m_internals->BlockChecked.disconnect_all_slots();
|
||||||
g_signals.Broadcast.disconnect_all_slots();
|
g_signals.m_internals->Broadcast.disconnect_all_slots();
|
||||||
g_signals.Inventory.disconnect_all_slots();
|
g_signals.m_internals->Inventory.disconnect_all_slots();
|
||||||
g_signals.SetBestChain.disconnect_all_slots();
|
g_signals.m_internals->SetBestChain.disconnect_all_slots();
|
||||||
g_signals.TransactionAddedToMempool.disconnect_all_slots();
|
g_signals.m_internals->TransactionAddedToMempool.disconnect_all_slots();
|
||||||
g_signals.BlockConnected.disconnect_all_slots();
|
g_signals.m_internals->BlockConnected.disconnect_all_slots();
|
||||||
g_signals.BlockDisconnected.disconnect_all_slots();
|
g_signals.m_internals->BlockDisconnected.disconnect_all_slots();
|
||||||
g_signals.UpdatedBlockTip.disconnect_all_slots();
|
g_signals.m_internals->UpdatedBlockTip.disconnect_all_slots();
|
||||||
g_signals.NewPoWValidBlock.disconnect_all_slots();
|
g_signals.m_internals->NewPoWValidBlock.disconnect_all_slots();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMainSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
|
||||||
|
m_internals->UpdatedBlockTip(pindexNew, pindexFork, fInitialDownload);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMainSignals::TransactionAddedToMempool(const CTransactionRef &ptx) {
|
||||||
|
m_internals->TransactionAddedToMempool(ptx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMainSignals::BlockConnected(const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex, const std::vector<CTransactionRef>& vtxConflicted) {
|
||||||
|
m_internals->BlockConnected(pblock, pindex, vtxConflicted);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMainSignals::BlockDisconnected(const std::shared_ptr<const CBlock> &pblock) {
|
||||||
|
m_internals->BlockDisconnected(pblock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMainSignals::SetBestChain(const CBlockLocator &locator) {
|
||||||
|
m_internals->SetBestChain(locator);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMainSignals::Inventory(const uint256 &hash) {
|
||||||
|
m_internals->Inventory(hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMainSignals::Broadcast(int64_t nBestBlockTime, CConnman* connman) {
|
||||||
|
m_internals->Broadcast(nBestBlockTime, connman);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMainSignals::BlockChecked(const CBlock& block, const CValidationState& state) {
|
||||||
|
m_internals->BlockChecked(block, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMainSignals::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock> &block) {
|
||||||
|
m_internals->NewPoWValidBlock(pindex, block);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
#ifndef BITCOIN_VALIDATIONINTERFACE_H
|
#ifndef BITCOIN_VALIDATIONINTERFACE_H
|
||||||
#define BITCOIN_VALIDATIONINTERFACE_H
|
#define BITCOIN_VALIDATIONINTERFACE_H
|
||||||
|
|
||||||
#include <boost/signals2/signal.hpp>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "primitives/transaction.h" // CTransaction(Ref)
|
#include "primitives/transaction.h" // CTransaction(Ref)
|
||||||
|
@ -32,49 +31,60 @@ void UnregisterAllValidationInterfaces();
|
||||||
|
|
||||||
class CValidationInterface {
|
class CValidationInterface {
|
||||||
protected:
|
protected:
|
||||||
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {}
|
|
||||||
virtual void TransactionAddedToMempool(const CTransactionRef &ptxn) {}
|
|
||||||
virtual void BlockConnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex *pindex, const std::vector<CTransactionRef> &txnConflicted) {}
|
|
||||||
virtual void BlockDisconnected(const std::shared_ptr<const CBlock> &block) {}
|
|
||||||
virtual void SetBestChain(const CBlockLocator &locator) {}
|
|
||||||
virtual void Inventory(const uint256 &hash) {}
|
|
||||||
virtual void ResendWalletTransactions(int64_t nBestBlockTime, CConnman* connman) {}
|
|
||||||
virtual void BlockChecked(const CBlock&, const CValidationState&) {}
|
|
||||||
virtual void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& block) {};
|
|
||||||
friend void ::RegisterValidationInterface(CValidationInterface*);
|
|
||||||
friend void ::UnregisterValidationInterface(CValidationInterface*);
|
|
||||||
friend void ::UnregisterAllValidationInterfaces();
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CMainSignals {
|
|
||||||
/** Notifies listeners of updated block chain tip */
|
/** Notifies listeners of updated block chain tip */
|
||||||
boost::signals2::signal<void (const CBlockIndex *, const CBlockIndex *, bool fInitialDownload)> UpdatedBlockTip;
|
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {}
|
||||||
/** Notifies listeners of a transaction having been added to mempool. */
|
/** Notifies listeners of a transaction having been added to mempool. */
|
||||||
boost::signals2::signal<void (const CTransactionRef &)> TransactionAddedToMempool;
|
virtual void TransactionAddedToMempool(const CTransactionRef &ptxn) {}
|
||||||
/**
|
/**
|
||||||
* Notifies listeners of a block being connected.
|
* Notifies listeners of a block being connected.
|
||||||
* Provides a vector of transactions evicted from the mempool as a result.
|
* Provides a vector of transactions evicted from the mempool as a result.
|
||||||
*/
|
*/
|
||||||
boost::signals2::signal<void (const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex, const std::vector<CTransactionRef> &)> BlockConnected;
|
virtual void BlockConnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex *pindex, const std::vector<CTransactionRef> &txnConflicted) {}
|
||||||
/** Notifies listeners of a block being disconnected */
|
/** Notifies listeners of a block being disconnected */
|
||||||
boost::signals2::signal<void (const std::shared_ptr<const CBlock> &)> BlockDisconnected;
|
virtual void BlockDisconnected(const std::shared_ptr<const CBlock> &block) {}
|
||||||
/** Notifies listeners of a new active block chain. */
|
/** Notifies listeners of the new active block chain on-disk. */
|
||||||
boost::signals2::signal<void (const CBlockLocator &)> SetBestChain;
|
virtual void SetBestChain(const CBlockLocator &locator) {}
|
||||||
/** Notifies listeners about an inventory item being seen on the network. */
|
/** Notifies listeners about an inventory item being seen on the network. */
|
||||||
boost::signals2::signal<void (const uint256 &)> Inventory;
|
virtual void Inventory(const uint256 &hash) {}
|
||||||
/** Tells listeners to broadcast their data. */
|
/** Tells listeners to broadcast their data. */
|
||||||
boost::signals2::signal<void (int64_t nBestBlockTime, CConnman* connman)> Broadcast;
|
virtual void ResendWalletTransactions(int64_t nBestBlockTime, CConnman* connman) {}
|
||||||
/**
|
/**
|
||||||
* Notifies listeners of a block validation result.
|
* Notifies listeners of a block validation result.
|
||||||
* If the provided CValidationState IsValid, the provided block
|
* If the provided CValidationState IsValid, the provided block
|
||||||
* is guaranteed to be the current best block at the time the
|
* is guaranteed to be the current best block at the time the
|
||||||
* callback was generated (not necessarily now)
|
* callback was generated (not necessarily now)
|
||||||
*/
|
*/
|
||||||
boost::signals2::signal<void (const CBlock&, const CValidationState&)> BlockChecked;
|
virtual void BlockChecked(const CBlock&, const CValidationState&) {}
|
||||||
/**
|
/**
|
||||||
* Notifies listeners that a block which builds directly on our current tip
|
* Notifies listeners that a block which builds directly on our current tip
|
||||||
* has been received and connected to the headers tree, though not validated yet */
|
* has been received and connected to the headers tree, though not validated yet */
|
||||||
boost::signals2::signal<void (const CBlockIndex *, const std::shared_ptr<const CBlock>&)> NewPoWValidBlock;
|
virtual void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& block) {};
|
||||||
|
friend void ::RegisterValidationInterface(CValidationInterface*);
|
||||||
|
friend void ::UnregisterValidationInterface(CValidationInterface*);
|
||||||
|
friend void ::UnregisterAllValidationInterfaces();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MainSignalsInstance;
|
||||||
|
class CMainSignals {
|
||||||
|
private:
|
||||||
|
std::unique_ptr<MainSignalsInstance> m_internals;
|
||||||
|
|
||||||
|
friend void ::RegisterValidationInterface(CValidationInterface*);
|
||||||
|
friend void ::UnregisterValidationInterface(CValidationInterface*);
|
||||||
|
friend void ::UnregisterAllValidationInterfaces();
|
||||||
|
public:
|
||||||
|
CMainSignals();
|
||||||
|
|
||||||
|
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
|
||||||
|
void TransactionAddedToMempool(const CTransactionRef &);
|
||||||
|
void BlockConnected(const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex, const std::vector<CTransactionRef> &);
|
||||||
|
void BlockDisconnected(const std::shared_ptr<const CBlock> &);
|
||||||
|
void UpdatedTransaction(const uint256 &);
|
||||||
|
void SetBestChain(const CBlockLocator &);
|
||||||
|
void Inventory(const uint256 &);
|
||||||
|
void Broadcast(int64_t nBestBlockTime, CConnman* connman);
|
||||||
|
void BlockChecked(const CBlock&, const CValidationState&);
|
||||||
|
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr<const CBlock>&);
|
||||||
};
|
};
|
||||||
|
|
||||||
CMainSignals& GetMainSignals();
|
CMainSignals& GetMainSignals();
|
||||||
|
|
Loading…
Reference in a new issue