diff --git a/src/task.c b/src/task.c index 761fc29a3..7ce1cd2a3 100644 --- a/src/task.c +++ b/src/task.c @@ -94,16 +94,18 @@ void task_kill(struct task *t) * the task's first thread for the job. */ thr = my_ffsl(t->thread_mask) - 1; - if (MT_LIST_ADDQ(&task_per_thread[thr].shared_tasklet_list, - (struct mt_list *)&((struct tasklet *)t)->list)) { - _HA_ATOMIC_ADD(&tasks_run_queue, 1); - _HA_ATOMIC_ADD(&task_per_thread[thr].task_list_size, 1); - if (sleeping_thread_mask & (1UL << thr)) { - _HA_ATOMIC_AND(&sleeping_thread_mask, ~(1UL << thr)); - wake_thread(thr); - } - return; + + /* Beware: tasks that have never run don't have their ->list empty yet! */ + LIST_INIT(&((struct tasklet *)t)->list); + BUG_ON(!MT_LIST_ADDQ(&task_per_thread[thr].shared_tasklet_list, + (struct mt_list *)&((struct tasklet *)t)->list)); + _HA_ATOMIC_ADD(&tasks_run_queue, 1); + _HA_ATOMIC_ADD(&task_per_thread[thr].task_list_size, 1); + if (sleeping_thread_mask & (1UL << thr)) { + _HA_ATOMIC_AND(&sleeping_thread_mask, ~(1UL << thr)); + wake_thread(thr); } + return; } } }