MINOR: tasks: Make sure we correctly init and deinit a tasklet.
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.
diff --git a/include/proto/task.h b/include/proto/task.h
index 2662460..dd08392 100644
--- a/include/proto/task.h
+++ b/include/proto/task.h
@@ -231,6 +231,7 @@
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)) {
@@ -272,7 +273,7 @@
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)
@@ -323,9 +324,10 @@
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);