Merge pull request #240 from vibe-d/fix_worker_task_scheduling
Fix a worker task scheduling issue for busy worker tasks.
This commit is contained in:
commit
0c1ea531b8
|
@ -132,7 +132,7 @@ struct ScopedMutexLock(M)
|
|||
@property bool locked() const { return m_locked; }
|
||||
|
||||
void unlock()
|
||||
in (this.locked)
|
||||
in { assert(this.locked); }
|
||||
do {
|
||||
enforce(m_locked);
|
||||
m_mutex.unlock();
|
||||
|
@ -140,13 +140,13 @@ struct ScopedMutexLock(M)
|
|||
}
|
||||
|
||||
bool tryLock()
|
||||
in (!this.locked)
|
||||
in { assert(!this.locked); }
|
||||
do {
|
||||
return m_locked = m_mutex.tryLock();
|
||||
}
|
||||
|
||||
void lock()
|
||||
in (!this.locked)
|
||||
in { assert(!this.locked); }
|
||||
do {
|
||||
m_locked = true;
|
||||
m_mutex.lock();
|
||||
|
|
|
@ -346,7 +346,16 @@ private final class WorkerThread : Thread {
|
|||
try {
|
||||
if (m_pool.m_state.lock.term) return;
|
||||
logDebug("entering worker thread");
|
||||
handleWorkerTasks();
|
||||
|
||||
// There is an issue where a task that periodically calls yield()
|
||||
// but otherwise only performs a CPU computation will cause a
|
||||
// call to runEventLoopOnce() or yield() called from the global
|
||||
// thread context to not return before the task is finished. For
|
||||
// this reason we start a task here, which in turn is scheduled
|
||||
// properly together with such a task, and also is schduled
|
||||
// according to the task priorities.
|
||||
runTask(&handleWorkerTasks).joinUninterruptible();
|
||||
|
||||
logDebug("Worker thread exit.");
|
||||
} catch (Throwable th) {
|
||||
th.logException!(LogLevel.fatal)("Worker thread terminated due to uncaught error");
|
||||
|
|
Loading…
Reference in a new issue