Skip to content

Commit 56e0ce0

Browse files
committed
Refactor engine worker thread relaunching.
1 parent 898f13c commit 56e0ce0

File tree

2 files changed

+76
-33
lines changed

2 files changed

+76
-33
lines changed

.astylerc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
# Usage:
77
# astyle --suffix=none --options=.astylerc filename.cpp
8+
# or recursively
9+
# astyle --suffix=none --options=.astylerc -r 'include/*' 'src/*'
10+
# or using find
11+
# find src include -type f | xargs astyle --suffix=none --options=.astylerc
812

913
style=java
1014
indent=tab=2

src/engine/Engine.cpp

Lines changed: 72 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -147,27 +147,58 @@ struct EngineWorker {
147147
Engine* engine;
148148
int id;
149149
std::thread thread;
150-
bool running = true;
150+
bool running = false;
151151

152152
void start() {
153+
assert(!running);
154+
running = true;
153155
thread = std::thread([&] {
154156
random::init();
155157
run();
156158
});
157159
}
158160

159-
void stop() {
161+
void requestStop() {
160162
running = false;
161163
}
162164

163165
void join() {
166+
assert(thread.joinable());
164167
thread.join();
165168
}
166169

167170
void run();
168171
};
169172

170173

174+
struct ProfilerWorker {
175+
Engine* engine;
176+
std::thread thread;
177+
bool running = false;
178+
179+
void start() {
180+
assert(!running);
181+
running = true;
182+
thread = std::thread([&] {
183+
run();
184+
});
185+
}
186+
187+
void stop() {
188+
running = false;
189+
if (thread.joinable())
190+
thread.join();
191+
}
192+
193+
void run() {
194+
while (running) {
195+
DEBUG("sample");
196+
std::this_thread::sleep_for(std::chrono::nanoseconds(100000000));
197+
}
198+
}
199+
};
200+
201+
171202
struct Engine::Internal {
172203
std::vector<Module*> modules;
173204
std::vector<Cable*> cables;
@@ -193,20 +224,18 @@ struct Engine::Internal {
193224
VIPMutex vipMutex;
194225

195226
bool realTime = false;
196-
int threadCount = 1;
227+
int threadCount = 0;
197228
std::vector<EngineWorker> workers;
198229
HybridBarrier engineBarrier;
199230
HybridBarrier workerBarrier;
200231
std::atomic<int> workerModuleIndex;
232+
ProfilerWorker profilerWorker;
201233
};
202234

203235

204236
Engine::Engine() {
205237
internal = new Internal;
206238

207-
internal->engineBarrier.total = 1;
208-
internal->workerBarrier.total = 1;
209-
210239
internal->sampleRate = 44100.f;
211240
internal->sampleTime = 1 / internal->sampleRate;
212241

@@ -351,36 +380,49 @@ static void Engine_updateExpander(Engine* that, Module::Expander* expander) {
351380
}
352381
}
353382

354-
static void Engine_relaunchWorkers(Engine* that) {
383+
static void Engine_relaunchWorkers(Engine* that, int threadCount, bool realTime) {
355384
Engine::Internal* internal = that->internal;
356-
assert(1 <= internal->threadCount);
357385

358-
// Stop all workers
359-
for (EngineWorker& worker : internal->workers) {
360-
worker.stop();
361-
}
362-
internal->engineBarrier.wait();
386+
if (internal->threadCount > 0) {
387+
// Stop profiler
388+
// internal->profilerWorker.stop();
363389

364-
// Destroy all workers
365-
for (EngineWorker& worker : internal->workers) {
366-
worker.join();
390+
// Stop engine workers
391+
for (EngineWorker& worker : internal->workers) {
392+
worker.requestStop();
393+
}
394+
internal->engineBarrier.wait();
395+
396+
// Join and destroy engine workers
397+
for (EngineWorker& worker : internal->workers) {
398+
worker.join();
399+
}
400+
internal->workers.resize(0);
367401
}
368-
internal->workers.resize(0);
369402

370-
// Configure main thread
371-
system::setThreadRealTime(internal->realTime);
403+
// Configure engine
404+
internal->threadCount = threadCount;
405+
internal->realTime = realTime;
372406

373407
// Set barrier counts
374-
internal->engineBarrier.total = internal->threadCount;
375-
internal->workerBarrier.total = internal->threadCount;
408+
internal->engineBarrier.total = threadCount;
409+
internal->workerBarrier.total = threadCount;
410+
411+
// Configure main thread
412+
system::setThreadRealTime(realTime);
413+
414+
if (threadCount > 0) {
415+
// Create and start engine workers
416+
internal->workers.resize(threadCount - 1);
417+
for (int id = 1; id < threadCount; id++) {
418+
EngineWorker& worker = internal->workers[id - 1];
419+
worker.id = id;
420+
worker.engine = that;
421+
worker.start();
422+
}
376423

377-
// Create workers
378-
internal->workers.resize(internal->threadCount - 1);
379-
for (int id = 1; id < internal->threadCount; id++) {
380-
EngineWorker& worker = internal->workers[id - 1];
381-
worker.id = id;
382-
worker.engine = that;
383-
worker.start();
424+
// Start profiler
425+
// internal->profilerWorker.start();
384426
}
385427
}
386428

@@ -413,9 +455,7 @@ static void Engine_run(Engine* that) {
413455

414456
// Launch workers
415457
if (internal->threadCount != settings::threadCount || internal->realTime != settings::realTime) {
416-
internal->threadCount = settings::threadCount;
417-
internal->realTime = settings::realTime;
418-
Engine_relaunchWorkers(that);
458+
Engine_relaunchWorkers(that, settings::threadCount, settings::realTime);
419459
}
420460

421461
if (!internal->paused) {
@@ -450,8 +490,7 @@ static void Engine_run(Engine* that) {
450490
}
451491

452492
// Stop workers
453-
internal->threadCount = 1;
454-
Engine_relaunchWorkers(that);
493+
Engine_relaunchWorkers(that, 0, false);
455494
}
456495

457496
void Engine::start() {

0 commit comments

Comments
 (0)