From 8fe4253bf688c90da5bd4cfefa36e5360a167a41 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 19 Dec 2019 07:34:20 +0100 Subject: [PATCH] MINOR: task: only check TASK_WOKEN_ANY to decide to requeue a task After processing a task, its RUNNING bit is cleared and at the same time we check for other bits to decide whether to requeue the task or not. It happens that we only want to check the TASK_WOKEN_* bits, because : - TASK_RUNNING was just cleared - TASK_GLOBAL and TASK_QUEUE cannot be set yet as the task was running, preventing it from being requeued It's important not to catch yet undefined flags there because it would prevent addition of new task flags. This also shows more clearly that waking a task up with flags 0 is not something safe to do as the task will not be woken up if it's already running. --- src/task.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/task.c b/src/task.c index 304e05694d..7a8cf16390 100644 --- a/src/task.c +++ b/src/task.c @@ -482,7 +482,7 @@ void process_runnable_tasks() } state = _HA_ATOMIC_AND(&t->state, ~TASK_RUNNING); - if (state) + if (state & TASK_WOKEN_ANY) task_wakeup(t, 0); else task_queue(t);