@@ -147,27 +147,58 @@ struct EngineWorker {
147
147
Engine* engine;
148
148
int id;
149
149
std::thread thread;
150
- bool running = true ;
150
+ bool running = false ;
151
151
152
152
void start () {
153
+ assert (!running);
154
+ running = true ;
153
155
thread = std::thread ([&] {
154
156
random::init ();
155
157
run ();
156
158
});
157
159
}
158
160
159
- void stop () {
161
+ void requestStop () {
160
162
running = false ;
161
163
}
162
164
163
165
void join () {
166
+ assert (thread.joinable ());
164
167
thread.join ();
165
168
}
166
169
167
170
void run ();
168
171
};
169
172
170
173
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
+
171
202
struct Engine ::Internal {
172
203
std::vector<Module*> modules;
173
204
std::vector<Cable*> cables;
@@ -193,20 +224,18 @@ struct Engine::Internal {
193
224
VIPMutex vipMutex;
194
225
195
226
bool realTime = false ;
196
- int threadCount = 1 ;
227
+ int threadCount = 0 ;
197
228
std::vector<EngineWorker> workers;
198
229
HybridBarrier engineBarrier;
199
230
HybridBarrier workerBarrier;
200
231
std::atomic<int > workerModuleIndex;
232
+ ProfilerWorker profilerWorker;
201
233
};
202
234
203
235
204
236
Engine::Engine () {
205
237
internal = new Internal;
206
238
207
- internal->engineBarrier .total = 1 ;
208
- internal->workerBarrier .total = 1 ;
209
-
210
239
internal->sampleRate = 44100 .f ;
211
240
internal->sampleTime = 1 / internal->sampleRate ;
212
241
@@ -351,36 +380,49 @@ static void Engine_updateExpander(Engine* that, Module::Expander* expander) {
351
380
}
352
381
}
353
382
354
- static void Engine_relaunchWorkers (Engine* that) {
383
+ static void Engine_relaunchWorkers (Engine* that, int threadCount, bool realTime ) {
355
384
Engine::Internal* internal = that->internal ;
356
- assert (1 <= internal->threadCount );
357
385
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();
363
389
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 );
367
401
}
368
- internal->workers .resize (0 );
369
402
370
- // Configure main thread
371
- system::setThreadRealTime (internal->realTime );
403
+ // Configure engine
404
+ internal->threadCount = threadCount;
405
+ internal->realTime = realTime;
372
406
373
407
// 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
+ }
376
423
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();
384
426
}
385
427
}
386
428
@@ -413,9 +455,7 @@ static void Engine_run(Engine* that) {
413
455
414
456
// Launch workers
415
457
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);
419
459
}
420
460
421
461
if (!internal->paused ) {
@@ -450,8 +490,7 @@ static void Engine_run(Engine* that) {
450
490
}
451
491
452
492
// Stop workers
453
- internal->threadCount = 1 ;
454
- Engine_relaunchWorkers (that);
493
+ Engine_relaunchWorkers (that, 0 , false );
455
494
}
456
495
457
496
void Engine::start () {
0 commit comments