Skip to content

Commit fa4652c

Browse files
author
MacroFake
committed
Pass lifetimebound reference to SingleThreadedSchedulerClient
1 parent 26296eb commit fa4652c

File tree

4 files changed

+16
-13
lines changed

4 files changed

+16
-13
lines changed

src/scheduler.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ void SingleThreadedSchedulerClient::MaybeScheduleProcessQueue()
143143
if (m_are_callbacks_running) return;
144144
if (m_callbacks_pending.empty()) return;
145145
}
146-
m_pscheduler->schedule(std::bind(&SingleThreadedSchedulerClient::ProcessQueue, this), std::chrono::system_clock::now());
146+
m_scheduler.schedule([this] { this->ProcessQueue(); }, std::chrono::system_clock::now());
147147
}
148148

149149
void SingleThreadedSchedulerClient::ProcessQueue()
@@ -179,8 +179,6 @@ void SingleThreadedSchedulerClient::ProcessQueue()
179179

180180
void SingleThreadedSchedulerClient::AddToProcessQueue(std::function<void()> func)
181181
{
182-
assert(m_pscheduler);
183-
184182
{
185183
LOCK(m_callbacks_mutex);
186184
m_callbacks_pending.emplace_back(std::move(func));
@@ -190,7 +188,7 @@ void SingleThreadedSchedulerClient::AddToProcessQueue(std::function<void()> func
190188

191189
void SingleThreadedSchedulerClient::EmptyQueue()
192190
{
193-
assert(!m_pscheduler->AreThreadsServicingQueue());
191+
assert(!m_scheduler.AreThreadsServicingQueue());
194192
bool should_continue = true;
195193
while (should_continue) {
196194
ProcessQueue();

src/scheduler.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,18 @@
55
#ifndef BITCOIN_SCHEDULER_H
66
#define BITCOIN_SCHEDULER_H
77

8+
#include <attributes.h>
9+
#include <sync.h>
10+
#include <threadsafety.h>
11+
12+
#include <chrono>
813
#include <condition_variable>
14+
#include <cstddef>
915
#include <functional>
1016
#include <list>
1117
#include <map>
1218
#include <thread>
13-
14-
#include <sync.h>
19+
#include <utility>
1520

1621
/**
1722
* Simple class for background tasks that should be run
@@ -117,7 +122,7 @@ class CScheduler
117122
class SingleThreadedSchedulerClient
118123
{
119124
private:
120-
CScheduler* m_pscheduler;
125+
CScheduler& m_scheduler;
121126

122127
Mutex m_callbacks_mutex;
123128
std::list<std::function<void()>> m_callbacks_pending GUARDED_BY(m_callbacks_mutex);
@@ -127,7 +132,7 @@ class SingleThreadedSchedulerClient
127132
void ProcessQueue();
128133

129134
public:
130-
explicit SingleThreadedSchedulerClient(CScheduler* pschedulerIn) : m_pscheduler(pschedulerIn) {}
135+
explicit SingleThreadedSchedulerClient(CScheduler& scheduler LIFETIMEBOUND) : m_scheduler{scheduler} {}
131136

132137
/**
133138
* Add a callback to be executed. Callbacks are executed serially

src/test/scheduler_tests.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,16 +128,16 @@ BOOST_AUTO_TEST_CASE(singlethreadedscheduler_ordered)
128128
CScheduler scheduler;
129129

130130
// each queue should be well ordered with respect to itself but not other queues
131-
SingleThreadedSchedulerClient queue1(&scheduler);
132-
SingleThreadedSchedulerClient queue2(&scheduler);
131+
SingleThreadedSchedulerClient queue1(scheduler);
132+
SingleThreadedSchedulerClient queue2(scheduler);
133133

134134
// create more threads than queues
135135
// if the queues only permit execution of one task at once then
136136
// the extra threads should effectively be doing nothing
137137
// if they don't we'll get out of order behaviour
138138
std::vector<std::thread> threads;
139139
for (int i = 0; i < 5; ++i) {
140-
threads.emplace_back(std::bind(&CScheduler::serviceQueue, &scheduler));
140+
threads.emplace_back([&] { scheduler.serviceQueue(); });
141141
}
142142

143143
// these are not atomic, if SinglethreadedSchedulerClient prevents

src/validationinterface.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct MainSignalsInstance {
4040
// our own queue here :(
4141
SingleThreadedSchedulerClient m_schedulerClient;
4242

43-
explicit MainSignalsInstance(CScheduler *pscheduler) : m_schedulerClient(pscheduler) {}
43+
explicit MainSignalsInstance(CScheduler& scheduler LIFETIMEBOUND) : m_schedulerClient(scheduler) {}
4444

4545
void Register(std::shared_ptr<CValidationInterface> callbacks)
4646
{
@@ -92,7 +92,7 @@ static CMainSignals g_signals;
9292
void CMainSignals::RegisterBackgroundSignalScheduler(CScheduler& scheduler)
9393
{
9494
assert(!m_internals);
95-
m_internals.reset(new MainSignalsInstance(&scheduler));
95+
m_internals = std::make_unique<MainSignalsInstance>(scheduler);
9696
}
9797

9898
void CMainSignals::UnregisterBackgroundSignalScheduler()

0 commit comments

Comments
 (0)