Skip to content

Commit 4abde2c

Browse files
committed
[refactor] Make MainSignals RAII styled
1 parent 84f5c13 commit 4abde2c

File tree

5 files changed

+18
-45
lines changed

5 files changed

+18
-45
lines changed

src/bitcoin-chainstate.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,11 @@ int main(int argc, char* argv[])
7474
// Start the lightweight task scheduler thread
7575
scheduler.m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { scheduler.serviceQueue(); });
7676

77-
CMainSignals validation_signals{};
77+
CMainSignals validation_signals{scheduler};
7878

7979
// Gather some entropy once per minute.
8080
scheduler.scheduleEvery(RandAddPeriodic, std::chrono::minutes{1});
8181

82-
validation_signals.RegisterBackgroundSignalScheduler(scheduler);
83-
8482
class KernelNotifications : public kernel::Notifications
8583
{
8684
public:
@@ -303,5 +301,4 @@ int main(int argc, char* argv[])
303301
}
304302
}
305303
}
306-
validation_signals.UnregisterBackgroundSignalScheduler();
307304
}

src/init.cpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,6 @@ void Shutdown(NodeContext& node)
377377
node.chain_clients.clear();
378378
if (node.validation_signals) {
379379
node.validation_signals->UnregisterAllValidationInterfaces();
380-
node.validation_signals->UnregisterBackgroundSignalScheduler();
381380
}
382381
node.mempool.reset();
383382
node.fee_estimator.reset();
@@ -1143,17 +1142,18 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
11431142

11441143
assert(!node.scheduler);
11451144
node.scheduler = std::make_unique<CScheduler>();
1145+
auto& scheduler = *node.scheduler;
11461146

11471147
// Start the lightweight task scheduler thread
1148-
node.scheduler->m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { node.scheduler->serviceQueue(); });
1148+
scheduler.m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { scheduler.serviceQueue(); });
11491149

11501150
// Gather some entropy once per minute.
1151-
node.scheduler->scheduleEvery([]{
1151+
scheduler.scheduleEvery([]{
11521152
RandAddPeriodic();
11531153
}, std::chrono::minutes{1});
11541154

11551155
// Check disk space every 5 minutes to avoid db corruption.
1156-
node.scheduler->scheduleEvery([&args, &node]{
1156+
scheduler.scheduleEvery([&args, &node]{
11571157
constexpr uint64_t min_disk_space = 50 << 20; // 50 MB
11581158
if (!CheckDiskSpace(args.GetBlocksDirPath(), min_disk_space)) {
11591159
LogPrintf("Shutting down due to lack of disk space!\n");
@@ -1164,9 +1164,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
11641164
}, std::chrono::minutes{5});
11651165

11661166
assert(!node.validation_signals);
1167-
node.validation_signals = std::make_unique<CMainSignals>();
1167+
node.validation_signals = std::make_unique<CMainSignals>(scheduler);
11681168
auto& validation_signals = *node.validation_signals;
1169-
validation_signals.RegisterBackgroundSignalScheduler(*node.scheduler);
11701169

11711170
// Create client interfaces for wallets that are supposed to be loaded
11721171
// according to -wallet and -disablewallet options. This only constructs
@@ -1271,7 +1270,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
12711270

12721271
// Flush estimates to disk periodically
12731272
CBlockPolicyEstimator* fee_estimator = node.fee_estimator.get();
1274-
node.scheduler->scheduleEvery([fee_estimator] { fee_estimator->FlushFeeEstimates(); }, FEE_FLUSH_INTERVAL);
1273+
scheduler.scheduleEvery([fee_estimator] { fee_estimator->FlushFeeEstimates(); }, FEE_FLUSH_INTERVAL);
12751274
validation_signals.RegisterValidationInterface(fee_estimator);
12761275
}
12771276

@@ -1910,7 +1909,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
19101909

19111910
connOptions.m_i2p_accept_incoming = args.GetBoolArg("-i2pacceptincoming", DEFAULT_I2P_ACCEPT_INCOMING);
19121911

1913-
if (!node.connman->Start(*node.scheduler, connOptions)) {
1912+
if (!node.connman->Start(scheduler, connOptions)) {
19141913
return false;
19151914
}
19161915

@@ -1930,15 +1929,15 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
19301929
uiInterface.InitMessage(_("Done loading").translated);
19311930

19321931
for (const auto& client : node.chain_clients) {
1933-
client->start(*node.scheduler);
1932+
client->start(scheduler);
19341933
}
19351934

19361935
BanMan* banman = node.banman.get();
1937-
node.scheduler->scheduleEvery([banman]{
1936+
scheduler.scheduleEvery([banman]{
19381937
banman->DumpBanlist();
19391938
}, DUMP_BANS_INTERVAL);
19401939

1941-
if (node.peerman) node.peerman->StartScheduledTasks(*node.scheduler);
1940+
if (node.peerman) node.peerman->StartScheduledTasks(scheduler);
19421941

19431942
#if HAVE_SYSTEM
19441943
StartupNotify(args);

src/test/util/setup_common.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,7 @@ ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vecto
171171
// from blocking due to queue overrun.
172172
m_node.scheduler = std::make_unique<CScheduler>();
173173
m_node.scheduler->m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { m_node.scheduler->serviceQueue(); });
174-
m_node.validation_signals = std::make_unique<CMainSignals>();
175-
m_node.validation_signals->RegisterBackgroundSignalScheduler(*m_node.scheduler);
174+
m_node.validation_signals = std::make_unique<CMainSignals>(*m_node.scheduler);
176175

177176
m_node.fee_estimator = std::make_unique<CBlockPolicyEstimator>(FeeestPath(*m_node.args), DEFAULT_ACCEPT_STALE_FEE_ESTIMATES);
178177
m_node.mempool = std::make_unique<CTxMemPool>(MemPoolOptionsForTest(m_node));
@@ -205,7 +204,6 @@ ChainTestingSetup::~ChainTestingSetup()
205204
{
206205
if (m_node.scheduler) m_node.scheduler->stop();
207206
m_node.validation_signals->FlushBackgroundCallbacks();
208-
m_node.validation_signals->UnregisterBackgroundSignalScheduler();
209207
m_node.connman.reset();
210208
m_node.banman.reset();
211209
m_node.addrman.reset();

src/validationinterface.cpp

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -94,31 +94,18 @@ class MainSignalsImpl
9494
}
9595
};
9696

97-
CMainSignals::CMainSignals() {}
97+
CMainSignals::CMainSignals(CScheduler& scheduler)
98+
: m_internals{std::make_unique<MainSignalsImpl>(scheduler)} {}
9899

99100
CMainSignals::~CMainSignals() {}
100101

101-
void CMainSignals::RegisterBackgroundSignalScheduler(CScheduler& scheduler)
102-
{
103-
assert(!m_internals);
104-
m_internals = std::make_unique<MainSignalsImpl>(scheduler);
105-
}
106-
107-
void CMainSignals::UnregisterBackgroundSignalScheduler()
108-
{
109-
m_internals.reset(nullptr);
110-
}
111-
112102
void CMainSignals::FlushBackgroundCallbacks()
113103
{
114-
if (m_internals) {
115-
m_internals->m_schedulerClient.EmptyQueue();
116-
}
104+
m_internals->m_schedulerClient.EmptyQueue();
117105
}
118106

119107
size_t CMainSignals::CallbacksPending()
120108
{
121-
if (!m_internals) return 0;
122109
return m_internals->m_schedulerClient.CallbacksPending();
123110
}
124111

@@ -143,16 +130,11 @@ void CMainSignals::UnregisterSharedValidationInterface(std::shared_ptr<CValidati
143130

144131
void CMainSignals::UnregisterValidationInterface(CValidationInterface* callbacks)
145132
{
146-
if (m_internals) {
147-
m_internals->Unregister(callbacks);
148-
}
133+
m_internals->Unregister(callbacks);
149134
}
150135

151136
void CMainSignals::UnregisterAllValidationInterfaces()
152137
{
153-
if (!m_internals) {
154-
return;
155-
}
156138
m_internals->Clear();
157139
}
158140

src/validationinterface.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,10 @@ class CMainSignals {
160160
std::unique_ptr<MainSignalsImpl> m_internals;
161161

162162
public:
163-
CMainSignals();
163+
CMainSignals(CScheduler& scheduler LIFETIMEBOUND);
164+
164165
~CMainSignals();
165166

166-
/** Register a CScheduler to give callbacks which should run in the background (may only be called once) */
167-
void RegisterBackgroundSignalScheduler(CScheduler& scheduler);
168-
/** Unregister a CScheduler to give callbacks which should run in the background - these callbacks will now be dropped! */
169-
void UnregisterBackgroundSignalScheduler();
170167
/** Call any remaining callbacks on the calling thread */
171168
void FlushBackgroundCallbacks();
172169

0 commit comments

Comments
 (0)