diff --git a/include/proto/task.h b/include/proto/task.h index 8aceee508..3969dc30c 100644 --- a/include/proto/task.h +++ b/include/proto/task.h @@ -181,6 +181,8 @@ static inline struct task *__task_unlink_rq(struct task *t) { HA_ATOMIC_SUB(&tasks_run_queue, 1); eb32sc_delete(&t->rq); + if (t->state & TASK_GLOBAL) + HA_ATOMIC_AND(&t->state, ~TASK_GLOBAL); if (likely(t->nice)) HA_ATOMIC_SUB(&niced_tasks, 1); return t; diff --git a/include/types/task.h b/include/types/task.h index c001d45e2..bc64f43f5 100644 --- a/include/types/task.h +++ b/include/types/task.h @@ -32,6 +32,7 @@ /* values for task->state */ #define TASK_SLEEPING 0x0000 /* task sleeping */ #define TASK_RUNNING 0x0001 /* the task is currently running */ +#define TASK_GLOBAL 0x0002 /* The task is currently in the global runqueue */ #define TASK_WOKEN_INIT 0x0100 /* woken up for initialisation purposes */ #define TASK_WOKEN_TIMER 0x0200 /* woken up because of expired timer */ diff --git a/src/task.c b/src/task.c index df2435a71..94482ecf1 100644 --- a/src/task.c +++ b/src/task.c @@ -143,6 +143,7 @@ redo: #ifdef USE_THREAD if (root == &rqueue) { global_rqueue_size++; + HA_ATOMIC_OR(&t->state, TASK_GLOBAL); HA_SPIN_UNLOCK(TASK_RQ_LOCK, &rq_lock); } else #endif