task->cap = NULL;
task->worker = worker;
task->stopped = rtsFalse;
- task->stat = NoStatus;
- task->ret = NULL;
+ task->running_finalizers = rtsFalse;
task->n_spare_incalls = 0;
task->spare_incalls = NULL;
task->incall = NULL;
incall->task = task;
incall->suspended_tso = NULL;
incall->suspended_cap = NULL;
+ incall->stat = NoStatus;
+ incall->ret = NULL;
incall->next = NULL;
incall->prev = NULL;
incall->prev_stack = task->incall;
void
discardTasksExcept (Task *keep)
{
- Task *task;
+ Task *task, *next;
// Wipe the task list, except the current Task.
ACQUIRE_LOCK(&sched_mutex);
- for (task = all_tasks; task != NULL; task=task->all_link) {
+ for (task = all_tasks; task != NULL; task=next) {
+ next = task->all_link;
if (task != keep) {
debugTrace(DEBUG_sched, "discarding task %ld", (long)TASK_ID(task));
freeTask(task);
}
}
all_tasks = keep;
+ keep->all_link = NULL;
RELEASE_LOCK(&sched_mutex);
}