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.
This commit is contained in:
Olivier Houchard 2018-06-08 17:08:19 +02:00 committed by Willy Tarreau
parent fd9655c54d
commit dcd6f3a597
1 changed files with 4 additions and 2 deletions

View File

@ -231,6 +231,7 @@ static inline void task_insert_into_tasklet_list(struct task *t)
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 @@ static inline void tasklet_init(struct 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)
@ -323,9 +324,10 @@ static inline void task_free(struct task *t)
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);