Skip to content

Commit 2196c51

Browse files
committed
refactor: Use boost::scoped_connection in signal/slot, also prefer range-based loop instead of std::transform
1 parent be99270 commit 2196c51

File tree

3 files changed

+35
-39
lines changed

3 files changed

+35
-39
lines changed

src/rpc/server.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -500,11 +500,7 @@ UniValue CRPCTable::execute(const JSONRPCRequest &request) const
500500
std::vector<std::string> CRPCTable::listCommands() const
501501
{
502502
std::vector<std::string> commandList;
503-
typedef std::map<std::string, const CRPCCommand*> commandMap;
504-
505-
std::transform( mapCommands.begin(), mapCommands.end(),
506-
std::back_inserter(commandList),
507-
boost::bind(&commandMap::value_type::first,_1) );
503+
for (const auto& i : mapCommands) commandList.emplace_back(i.first);
508504
return commandList;
509505
}
510506

src/validation.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2368,14 +2368,11 @@ class ConnectTrace {
23682368
private:
23692369
std::vector<PerBlockConnectTrace> blocksConnected;
23702370
CTxMemPool &pool;
2371+
boost::signals2::scoped_connection m_connNotifyEntryRemoved;
23712372

23722373
public:
23732374
explicit ConnectTrace(CTxMemPool &_pool) : blocksConnected(1), pool(_pool) {
2374-
pool.NotifyEntryRemoved.connect(boost::bind(&ConnectTrace::NotifyEntryRemoved, this, _1, _2));
2375-
}
2376-
2377-
~ConnectTrace() {
2378-
pool.NotifyEntryRemoved.disconnect(boost::bind(&ConnectTrace::NotifyEntryRemoved, this, _1, _2));
2375+
m_connNotifyEntryRemoved = pool.NotifyEntryRemoved.connect(boost::bind(&ConnectTrace::NotifyEntryRemoved, this, _1, _2));
23792376
}
23802377

23812378
void BlockConnected(CBlockIndex* pindex, std::shared_ptr<const CBlock> pblock) {

src/validationinterface.cpp

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@
1717

1818
#include <boost/signals2/signal.hpp>
1919

20+
struct ValidationInterfaceConnections {
21+
boost::signals2::scoped_connection UpdatedBlockTip;
22+
boost::signals2::scoped_connection TransactionAddedToMempool;
23+
boost::signals2::scoped_connection BlockConnected;
24+
boost::signals2::scoped_connection BlockDisconnected;
25+
boost::signals2::scoped_connection TransactionRemovedFromMempool;
26+
boost::signals2::scoped_connection ChainStateFlushed;
27+
boost::signals2::scoped_connection Broadcast;
28+
boost::signals2::scoped_connection BlockChecked;
29+
boost::signals2::scoped_connection NewPoWValidBlock;
30+
};
31+
2032
struct MainSignalsInstance {
2133
boost::signals2::signal<void (const CBlockIndex *, const CBlockIndex *, bool fInitialDownload)> UpdatedBlockTip;
2234
boost::signals2::signal<void (const CTransactionRef &)> TransactionAddedToMempool;
@@ -32,12 +44,18 @@ struct MainSignalsInstance {
3244
// but must ensure all callbacks happen in-order, so we end up creating
3345
// our own queue here :(
3446
SingleThreadedSchedulerClient m_schedulerClient;
47+
std::unordered_map<CValidationInterface*, ValidationInterfaceConnections> m_connMainSignals;
3548

3649
explicit MainSignalsInstance(CScheduler *pscheduler) : m_schedulerClient(pscheduler) {}
3750
};
3851

3952
static CMainSignals g_signals;
4053

54+
// This map has to a separate global instead of a member of MainSignalsInstance,
55+
// because RegisterWithMempoolSignals is currently called before RegisterBackgroundSignalScheduler,
56+
// so MainSignalsInstance hasn't been created yet.
57+
static std::unordered_map<CTxMemPool*, boost::signals2::scoped_connection> g_connNotifyEntryRemoved;
58+
4159
void CMainSignals::RegisterBackgroundSignalScheduler(CScheduler& scheduler) {
4260
assert(!m_internals);
4361
m_internals.reset(new MainSignalsInstance(&scheduler));
@@ -59,11 +77,11 @@ size_t CMainSignals::CallbacksPending() {
5977
}
6078

6179
void CMainSignals::RegisterWithMempoolSignals(CTxMemPool& pool) {
62-
pool.NotifyEntryRemoved.connect(boost::bind(&CMainSignals::MempoolEntryRemoved, this, _1, _2));
80+
g_connNotifyEntryRemoved.emplace(&pool, pool.NotifyEntryRemoved.connect(boost::bind(&CMainSignals::MempoolEntryRemoved, this, _1, _2)));
6381
}
6482

6583
void CMainSignals::UnregisterWithMempoolSignals(CTxMemPool& pool) {
66-
pool.NotifyEntryRemoved.disconnect(boost::bind(&CMainSignals::MempoolEntryRemoved, this, _1, _2));
84+
g_connNotifyEntryRemoved.erase(&pool);
6785
}
6886

6987
CMainSignals& GetMainSignals()
@@ -72,42 +90,27 @@ CMainSignals& GetMainSignals()
7290
}
7391

7492
void RegisterValidationInterface(CValidationInterface* pwalletIn) {
75-
g_signals.m_internals->UpdatedBlockTip.connect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3));
76-
g_signals.m_internals->TransactionAddedToMempool.connect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, _1));
77-
g_signals.m_internals->BlockConnected.connect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, _1, _2, _3));
78-
g_signals.m_internals->BlockDisconnected.connect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, _1));
79-
g_signals.m_internals->TransactionRemovedFromMempool.connect(boost::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, _1));
80-
g_signals.m_internals->ChainStateFlushed.connect(boost::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, _1));
81-
g_signals.m_internals->Broadcast.connect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
82-
g_signals.m_internals->BlockChecked.connect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
83-
g_signals.m_internals->NewPoWValidBlock.connect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
93+
ValidationInterfaceConnections& conns = g_signals.m_internals->m_connMainSignals[pwalletIn];
94+
conns.UpdatedBlockTip = g_signals.m_internals->UpdatedBlockTip.connect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3));
95+
conns.TransactionAddedToMempool = g_signals.m_internals->TransactionAddedToMempool.connect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, _1));
96+
conns.BlockConnected = g_signals.m_internals->BlockConnected.connect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, _1, _2, _3));
97+
conns.BlockDisconnected = g_signals.m_internals->BlockDisconnected.connect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, _1));
98+
conns.TransactionRemovedFromMempool = g_signals.m_internals->TransactionRemovedFromMempool.connect(boost::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, _1));
99+
conns.ChainStateFlushed = g_signals.m_internals->ChainStateFlushed.connect(boost::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, _1));
100+
conns.Broadcast = g_signals.m_internals->Broadcast.connect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
101+
conns.BlockChecked = g_signals.m_internals->BlockChecked.connect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
102+
conns.NewPoWValidBlock = g_signals.m_internals->NewPoWValidBlock.connect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
84103
}
85104

86105
void UnregisterValidationInterface(CValidationInterface* pwalletIn) {
87-
g_signals.m_internals->BlockChecked.disconnect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
88-
g_signals.m_internals->Broadcast.disconnect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
89-
g_signals.m_internals->ChainStateFlushed.disconnect(boost::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, _1));
90-
g_signals.m_internals->TransactionAddedToMempool.disconnect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, _1));
91-
g_signals.m_internals->BlockConnected.disconnect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, _1, _2, _3));
92-
g_signals.m_internals->BlockDisconnected.disconnect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, _1));
93-
g_signals.m_internals->TransactionRemovedFromMempool.disconnect(boost::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, _1));
94-
g_signals.m_internals->UpdatedBlockTip.disconnect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3));
95-
g_signals.m_internals->NewPoWValidBlock.disconnect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
106+
g_signals.m_internals->m_connMainSignals.erase(pwalletIn);
96107
}
97108

98109
void UnregisterAllValidationInterfaces() {
99110
if (!g_signals.m_internals) {
100111
return;
101112
}
102-
g_signals.m_internals->BlockChecked.disconnect_all_slots();
103-
g_signals.m_internals->Broadcast.disconnect_all_slots();
104-
g_signals.m_internals->ChainStateFlushed.disconnect_all_slots();
105-
g_signals.m_internals->TransactionAddedToMempool.disconnect_all_slots();
106-
g_signals.m_internals->BlockConnected.disconnect_all_slots();
107-
g_signals.m_internals->BlockDisconnected.disconnect_all_slots();
108-
g_signals.m_internals->TransactionRemovedFromMempool.disconnect_all_slots();
109-
g_signals.m_internals->UpdatedBlockTip.disconnect_all_slots();
110-
g_signals.m_internals->NewPoWValidBlock.disconnect_all_slots();
113+
g_signals.m_internals->m_connMainSignals.clear();
111114
}
112115

113116
void CallFunctionInValidationInterfaceQueue(std::function<void ()> func) {

0 commit comments

Comments
 (0)