MINOR: applets: Use a bitfield to track applets activity per-thread
a bitfield has been added to know if there are runnable applets for a
thread. When an applet is woken up, the bits corresponding to its thread_mask
are set. When all active applets for a thread is get to be processed, the thread
is removed from active ones by unsetting its tid_bit from the bitfield.
diff --git a/include/proto/applet.h b/include/proto/applet.h
index 914b496..8024981 100644
--- a/include/proto/applet.h
+++ b/include/proto/applet.h
@@ -30,6 +30,7 @@
#include <proto/connection.h>
extern unsigned int nb_applets;
+extern unsigned long active_applets_mask;
extern unsigned int applets_active_queue;
__decl_hathreads(extern HA_SPINLOCK_T applet_active_lock);
extern struct list applet_active_queue;
@@ -113,6 +114,7 @@
if (LIST_ISEMPTY(&appctx->runq)) {
LIST_ADDQ(&applet_active_queue, &appctx->runq);
applets_active_queue++;
+ active_applets_mask |= appctx->thread_mask;
}
}
diff --git a/src/applet.c b/src/applet.c
index 1df6b09..e24f66d 100644
--- a/src/applet.c
+++ b/src/applet.c
@@ -21,6 +21,7 @@
#include <proto/stream_interface.h>
unsigned int nb_applets = 0;
+unsigned long active_applets_mask = 0;
unsigned int applets_active_queue = 0;
__decl_hathreads(HA_SPINLOCK_T applet_active_lock); /* spin lock related to applet active queue */
@@ -48,7 +49,7 @@
}
curr = next;
}
-
+ active_applets_mask &= ~tid_bit;
HA_SPIN_UNLOCK(APPLETS_LOCK, &applet_active_lock);
/* The list is only scanned from the head. This guarantees that if any