Fix synchronization and shutdown issues in TaskPool.
- terminate() would hang if called from a worker thread because it would attempt to self-join - the handleWorkerTasks could miss signal emits, resulting in a hanging task queue or a missed termination signal
This commit is contained in:
parent
9a4217cd88
commit
6caff0b105
|
@ -71,7 +71,6 @@ shared final class TaskPool {
|
|||
m_state.lock.term = true;
|
||||
m_signal.emit();
|
||||
|
||||
auto ec = m_signal.emitCount;
|
||||
while (true) {
|
||||
WorkerThread th;
|
||||
with (m_state.lock)
|
||||
|
@ -81,6 +80,9 @@ shared final class TaskPool {
|
|||
}
|
||||
if (!th) break;
|
||||
|
||||
if (th is Thread.getThis())
|
||||
continue;
|
||||
|
||||
() @trusted {
|
||||
try th.join();
|
||||
catch (Exception e) {
|
||||
|
@ -271,9 +273,8 @@ private final class WorkerThread : Thread {
|
|||
|
||||
logDebug("worker thread enter");
|
||||
TaskFuncInfo taskfunc;
|
||||
while(true){
|
||||
auto emit_count = m_pool.m_signal.emitCount;
|
||||
|
||||
auto emit_count = m_pool.m_signal.emitCount;
|
||||
while(true) {
|
||||
with (m_pool.m_state.lock) {
|
||||
logDebug("worker thread check");
|
||||
|
||||
|
@ -282,7 +283,7 @@ private final class WorkerThread : Thread {
|
|||
if (m_queue.consume(taskfunc)) {
|
||||
logDebug("worker thread got specific task");
|
||||
} else if (queue.consume(taskfunc)) {
|
||||
logDebug("worker thread got specific task");
|
||||
logDebug("worker thread got unspecific task");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue