Up until now, a tasklet couldn't be free'd while it was in the list, it is
no longer the case, so make sure we remove it from the list before freeing it.
To do so, we have to make sure we correctly initialize it, so use LIST_INIT,
instead of setting the pointers to NULL.
static inline void task_remove_from_task_list(struct task *t)
{
LIST_DEL(&((struct tasklet *)t)->list);
+ LIST_INIT(&((struct tasklet *)t)->list);
task_list_size[tid]--;
HA_ATOMIC_SUB(&tasks_run_queue, 1);
if (!TASK_IS_TASKLET(t)) {
t->nice = -32768;
t->calls = 0;
t->state = 0;
- t->list.p = t->list.n = NULL;
+ LIST_INIT(&t->list);
}
static inline struct tasklet *tasklet_new(void)
t->process = NULL;
}
-
static inline void tasklet_free(struct tasklet *tl)
{
+ LIST_DEL(&tl->list);
+
pool_free(pool_head_tasklet, tl);
if (unlikely(stopping))
pool_flush(pool_head_tasklet);