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:
parent
fae7d3e93d
commit
9b2aa13ef4
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue