Give CMainSignals a reference to the global scheduler
...so that it can run some signals in the background later
This commit is contained in:
parent
3a19fed9db
commit
cda1429d5b
5 changed files with 32 additions and 0 deletions
|
@ -251,6 +251,7 @@ void Shutdown()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
UnregisterAllValidationInterfaces();
|
UnregisterAllValidationInterfaces();
|
||||||
|
GetMainSignals().UnregisterBackgroundSignalScheduler();
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
for (CWalletRef pwallet : vpwallets) {
|
for (CWalletRef pwallet : vpwallets) {
|
||||||
delete pwallet;
|
delete pwallet;
|
||||||
|
@ -1203,6 +1204,8 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
|
CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
|
||||||
threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
|
threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
|
||||||
|
|
||||||
|
GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);
|
||||||
|
|
||||||
/* Start the RPC server already. It will be started in "warmup" mode
|
/* Start the RPC server already. It will be started in "warmup" mode
|
||||||
* and not really process calls already (but it will signify connections
|
* and not really process calls already (but it will signify connections
|
||||||
* that the server is there and will be ready later). Warmup mode will
|
* that the server is there and will be ready later). Warmup mode will
|
||||||
|
|
|
@ -62,6 +62,12 @@ TestingSetup::TestingSetup(const std::string& chainName) : BasicTestingSetup(cha
|
||||||
pathTemp = GetTempPath() / strprintf("test_bitcoin_%lu_%i", (unsigned long)GetTime(), (int)(InsecureRandRange(100000)));
|
pathTemp = GetTempPath() / strprintf("test_bitcoin_%lu_%i", (unsigned long)GetTime(), (int)(InsecureRandRange(100000)));
|
||||||
fs::create_directories(pathTemp);
|
fs::create_directories(pathTemp);
|
||||||
ForceSetArg("-datadir", pathTemp.string());
|
ForceSetArg("-datadir", pathTemp.string());
|
||||||
|
|
||||||
|
// Note that because we don't bother running a scheduler thread here,
|
||||||
|
// callbacks via CValidationInterface are unreliable, but that's OK,
|
||||||
|
// our unit tests aren't testing multiple parts of the code at once.
|
||||||
|
GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);
|
||||||
|
|
||||||
mempool.setSanityCheck(1.0);
|
mempool.setSanityCheck(1.0);
|
||||||
pblocktree = new CBlockTreeDB(1 << 20, true);
|
pblocktree = new CBlockTreeDB(1 << 20, true);
|
||||||
pcoinsdbview = new CCoinsViewDB(1 << 23, true);
|
pcoinsdbview = new CCoinsViewDB(1 << 23, true);
|
||||||
|
@ -88,6 +94,7 @@ TestingSetup::~TestingSetup()
|
||||||
UnregisterNodeSignals(GetNodeSignals());
|
UnregisterNodeSignals(GetNodeSignals());
|
||||||
threadGroup.interrupt_all();
|
threadGroup.interrupt_all();
|
||||||
threadGroup.join_all();
|
threadGroup.join_all();
|
||||||
|
GetMainSignals().UnregisterBackgroundSignalScheduler();
|
||||||
UnloadBlockIndex();
|
UnloadBlockIndex();
|
||||||
delete pcoinsTip;
|
delete pcoinsTip;
|
||||||
delete pcoinsdbview;
|
delete pcoinsdbview;
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "key.h"
|
#include "key.h"
|
||||||
#include "pubkey.h"
|
#include "pubkey.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
|
#include "scheduler.h"
|
||||||
#include "txdb.h"
|
#include "txdb.h"
|
||||||
#include "txmempool.h"
|
#include "txmempool.h"
|
||||||
|
|
||||||
|
@ -53,6 +54,7 @@ struct TestingSetup: public BasicTestingSetup {
|
||||||
fs::path pathTemp;
|
fs::path pathTemp;
|
||||||
boost::thread_group threadGroup;
|
boost::thread_group threadGroup;
|
||||||
CConnman* connman;
|
CConnman* connman;
|
||||||
|
CScheduler scheduler;
|
||||||
|
|
||||||
TestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
|
TestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
|
||||||
~TestingSetup();
|
~TestingSetup();
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include "validationinterface.h"
|
#include "validationinterface.h"
|
||||||
|
#include "init.h"
|
||||||
|
#include "scheduler.h"
|
||||||
|
|
||||||
#include <boost/signals2/signal.hpp>
|
#include <boost/signals2/signal.hpp>
|
||||||
|
|
||||||
|
@ -17,6 +19,8 @@ struct MainSignalsInstance {
|
||||||
boost::signals2::signal<void (int64_t nBestBlockTime, CConnman* connman)> Broadcast;
|
boost::signals2::signal<void (int64_t nBestBlockTime, CConnman* connman)> Broadcast;
|
||||||
boost::signals2::signal<void (const CBlock&, const CValidationState&)> BlockChecked;
|
boost::signals2::signal<void (const CBlock&, const CValidationState&)> BlockChecked;
|
||||||
boost::signals2::signal<void (const CBlockIndex *, const std::shared_ptr<const CBlock>&)> NewPoWValidBlock;
|
boost::signals2::signal<void (const CBlockIndex *, const std::shared_ptr<const CBlock>&)> NewPoWValidBlock;
|
||||||
|
|
||||||
|
CScheduler *m_scheduler = NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
static CMainSignals g_signals;
|
static CMainSignals g_signals;
|
||||||
|
@ -25,6 +29,15 @@ CMainSignals::CMainSignals() {
|
||||||
m_internals.reset(new MainSignalsInstance());
|
m_internals.reset(new MainSignalsInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CMainSignals::RegisterBackgroundSignalScheduler(CScheduler& scheduler) {
|
||||||
|
assert(!m_internals->m_scheduler);
|
||||||
|
m_internals->m_scheduler = &scheduler;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMainSignals::UnregisterBackgroundSignalScheduler() {
|
||||||
|
m_internals->m_scheduler = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
CMainSignals& GetMainSignals()
|
CMainSignals& GetMainSignals()
|
||||||
{
|
{
|
||||||
return g_signals;
|
return g_signals;
|
||||||
|
|
|
@ -19,6 +19,7 @@ class CReserveScript;
|
||||||
class CValidationInterface;
|
class CValidationInterface;
|
||||||
class CValidationState;
|
class CValidationState;
|
||||||
class uint256;
|
class uint256;
|
||||||
|
class CScheduler;
|
||||||
|
|
||||||
// These functions dispatch to one or all registered wallets
|
// These functions dispatch to one or all registered wallets
|
||||||
|
|
||||||
|
@ -72,9 +73,15 @@ private:
|
||||||
friend void ::RegisterValidationInterface(CValidationInterface*);
|
friend void ::RegisterValidationInterface(CValidationInterface*);
|
||||||
friend void ::UnregisterValidationInterface(CValidationInterface*);
|
friend void ::UnregisterValidationInterface(CValidationInterface*);
|
||||||
friend void ::UnregisterAllValidationInterfaces();
|
friend void ::UnregisterAllValidationInterfaces();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CMainSignals();
|
CMainSignals();
|
||||||
|
|
||||||
|
/** Register a CScheduler to give callbacks which should run in the background (may only be called once) */
|
||||||
|
void RegisterBackgroundSignalScheduler(CScheduler& scheduler);
|
||||||
|
/** Unregister a CScheduler to give callbacks which should run in the background - these callbacks will now be dropped! */
|
||||||
|
void UnregisterBackgroundSignalScheduler();
|
||||||
|
|
||||||
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
|
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
|
||||||
void TransactionAddedToMempool(const CTransactionRef &);
|
void TransactionAddedToMempool(const CTransactionRef &);
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex, const std::vector<CTransactionRef> &);
|
void BlockConnected(const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex, const std::vector<CTransactionRef> &);
|
||||||
|
|
Loading…
Reference in a new issue