diff --git a/src/init.cpp b/src/init.cpp index a1dbfd2a5f..f8b2b23fd0 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -571,10 +571,8 @@ bool AppInit2(boost::thread_group& threadGroup) // ********************************************************* Step 6: network initialization - SetProcessMessagesHandler(ProcessMessages); - SetSendMessagesHandler(SendMessages); - SetStartShutdownHandler(StartShutdown); - + RegisterNodeSignals(GetNodeSignals()); + int nSocksVersion = GetArg("-socks", 5); if (nSocksVersion != 4 && nSocksVersion != 5) return InitError(strprintf(_("Unknown -socks proxy version requested: %i"), nSocksVersion)); diff --git a/src/main.cpp b/src/main.cpp index bd40476d4c..98921e1423 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -160,7 +160,22 @@ void static ResendWalletTransactions() +////////////////////////////////////////////////////////////////////////////// +// +// Registration of network node signals. +// +void RegisterNodeSignals(CNodeSignals& nodeSignals) +{ + nodeSignals.ProcessMessages.connect(&ProcessMessages); + nodeSignals.SendMessages.connect(&SendMessages); +} + +void UnregisterNodeSignals(CNodeSignals& nodeSignals) +{ + nodeSignals.ProcessMessages.disconnect(&ProcessMessages); + nodeSignals.SendMessages.disconnect(&SendMessages); +} diff --git a/src/main.h b/src/main.h index f4e80c85ce..f62cfbef6d 100644 --- a/src/main.h +++ b/src/main.h @@ -124,6 +124,11 @@ void UnregisterWallet(CWallet* pwalletIn); /** Push an updated transaction to all registered wallets */ void SyncWithWallets(const uint256 &hash, const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false); +/** Register with a network node to receive its signals */ +void RegisterNodeSignals(CNodeSignals& nodeSignals); +/** Unregister a network node */ +void UnregisterNodeSignals(CNodeSignals& nodeSignals); + void PushGetBlocks(CNode* pnode, CBlockIndex* pindexBegin, uint256 hashEnd); /** Process an incoming block */ diff --git a/src/net.cpp b/src/net.cpp index 5932f5f8e3..dc9a7e5371 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -68,27 +68,9 @@ CCriticalSection cs_vAddedNodes; static CSemaphore *semOutbound = NULL; -// -// Handlers that need to be registered -// -static ProcessMessagesHandler fnProcessMessages = NULL; -static SendMessagesHandler fnSendMessages = NULL; -static StartShutdownHandler fnStartShutdown = NULL; - -void SetProcessMessagesHandler(ProcessMessagesHandler handler) -{ - fnProcessMessages = handler; -} - -void SetSendMessagesHandler(SendMessagesHandler handler) -{ - fnSendMessages = handler; -} - -void SetStartShutdownHandler(StartShutdownHandler handler) -{ - fnStartShutdown = handler; -} +// Signals for message handling +static CNodeSignals g_signals; +CNodeSignals& GetNodeSignals() { return g_signals; } void AddOneShot(string strDest) { @@ -1646,7 +1628,7 @@ void ThreadMessageHandler() { TRY_LOCK(pnode->cs_vRecvMsg, lockRecv); if (lockRecv) - if (!ProcessMessages(pnode)) + if (!g_signals.ProcessMessages(pnode)) pnode->CloseSocketDisconnect(); } boost::this_thread::interruption_point(); @@ -1654,8 +1636,8 @@ void ThreadMessageHandler() // Send messages { TRY_LOCK(pnode->cs_vSend, lockSend); - if (lockSend && fnSendMessages) - fnSendMessages(pnode, pnode == pnodeTrickle); + if (lockSend) + g_signals.SendMessages(pnode, pnode == pnodeTrickle); } boost::this_thread::interruption_point(); } diff --git a/src/net.h b/src/net.h index 1c8c99aa3b..fdac60d9ce 100644 --- a/src/net.h +++ b/src/net.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #ifndef WIN32 @@ -45,16 +46,15 @@ void StartNode(boost::thread_group& threadGroup); bool StopNode(); void SocketSendData(CNode *pnode); -// -// Handlers that require registration -// -typedef bool (*ProcessMessagesHandler)(CNode* pfrom); -typedef bool (*SendMessagesHandler)(CNode* pto, bool fSendTrickle); -typedef void (*StartShutdownHandler)(); +// Signals for message handling +struct CNodeSignals +{ + boost::signals2::signal ProcessMessages; + boost::signals2::signal SendMessages; +}; + +CNodeSignals& GetNodeSignals(); -void SetProcessMessagesHandler(ProcessMessagesHandler handler); -void SetSendMessagesHandler(SendMessagesHandler handler); -void SetStartShutdownHandler(StartShutdownHandler handler); enum {