Now that we can wake tasklet for other threads, make sure that if the thread
is sleeping, we wake it up, or the tasklet won't be executed until it's
done sleeping.
That also means that, before going to sleep, and after we put our bit
in sleeping_thread_mask, we have to check that nobody added a tasklet for
us, just checking for global_tasks_mask isn't enough anymore.
#include <types/global.h>
#include <types/task.h>
+#include <proto/fd.h>
+
/* Principle of the wait queue.
*
* We want to be able to tell whether an expiration date is before of after the
static inline void tasklet_wakeup(struct tasklet *tl)
{
- if (MT_LIST_ADDQ(&task_per_thread[tl->tid].task_list, &tl->list) == 1)
+ if (MT_LIST_ADDQ(&task_per_thread[tl->tid].task_list, &tl->list) == 1) {
_HA_ATOMIC_ADD(&tasks_run_queue, 1);
+ if (sleeping_thread_mask & (1 << tl->tid)) {
+ _HA_ATOMIC_AND(&sleeping_thread_mask, ~(1 << tl->tid));
+ wake_thread(tl->tid);
+ }
+ }
}
else {
_HA_ATOMIC_OR(&sleeping_thread_mask, tid_bit);
__ha_barrier_atomic_store();
- if (global_tasks_mask & tid_bit) {
+ if ((global_tasks_mask & tid_bit) || thread_has_tasks()) {
activity[tid].wake_tasks++;
_HA_ATOMIC_AND(&sleeping_thread_mask, ~tid_bit);
} else