提交 8d10f998 编写于 作者: A anoll

8042428: CompileQueue::free_all() code is incorrect

Summary: Free task after getting next pointer of freelist.
Reviewed-by: kvn, adlertz
上级 722c91bc
......@@ -664,17 +664,27 @@ void CompileQueue::add(CompileTask* task) {
lock()->notify_all();
}
/**
* Empties compilation queue by putting all compilation tasks onto
* a freelist. Furthermore, the method wakes up all threads that are
* waiting on a compilation task to finish. This can happen if background
* compilation is disabled.
*/
void CompileQueue::free_all() {
MutexLocker mu(lock());
if (_first != NULL) {
for (CompileTask* task = _first; task != NULL; task = task->next()) {
// Wake up thread that blocks on the compile task.
task->lock()->notify();
// Puts task back on the freelist.
CompileTask::free(task);
}
_first = NULL;
CompileTask* next = _first;
// Iterate over all tasks in the compile queue
while (next != NULL) {
CompileTask* current = next;
next = current->next();
// Wake up thread that blocks on the compile task.
current->lock()->notify();
// Put the task back on the freelist.
CompileTask::free(current);
}
_first = NULL;
// Wake up all threads that block on the queue.
lock()->notify_all();
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册