Fix possible infinite loop in TaskScheduler.process.

Fixes a discrepancy in TaskFiberQueue between empty and length, which causes process() to never return, thus processing events without timeout indefinitely.
This commit is contained in:
Sönke Ludwig 2018-08-26 13:03:14 +02:00
parent fae7d3e93d
commit 9b2aa13ef4

View file

@ -962,9 +962,29 @@ private struct TaskFiberQueue {
task.m_queue = null; task.m_queue = null;
task.m_prev = null; task.m_prev = null;
task.m_next = null; task.m_next = null;
length--;
} }
} }
unittest {
auto f1 = new TaskFiber;
auto f2 = new TaskFiber;
TaskFiberQueue q;
assert(q.empty && q.length == 0);
q.insertFront(f1);
assert(!q.empty && q.length == 1);
q.insertFront(f2);
assert(!q.empty && q.length == 2);
q.popFront();
assert(!q.empty && q.length == 1);
q.popFront();
assert(q.empty && q.length == 0);
q.insertFront(f1);
q.remove(f1);
assert(q.empty && q.length == 0);
}
private struct FLSInfo { private struct FLSInfo {
void function(void[], size_t) fct; void function(void[], size_t) fct;
size_t offset; size_t offset;