MAJOR: polling: Use active_appels_mask instead of applets_active_queue

applets_active_queue is the active queue size. It is a global variable. So it is
underoptimized because we may be lead to consider there are active applets for a
thread while in fact all active applets are assigned to the otherthreads. So, in
such cases, the polling loop will be evaluated many more times than necessary.

Instead, we now check if the thread id is set in the bitfield active_applets_mask.

This is specific to threads, no backport is needed.
This commit is contained in:
Christopher Faulet 2017-11-14 11:30:47 +01:00 committed by Willy Tarreau
parent 595d7b72a6
commit 7163056dc5
2 changed files with 5 additions and 4 deletions

View File

@ -33,10 +33,11 @@ void applet_run_active()
struct stream_interface *si;
struct list applet_cur_queue = LIST_HEAD_INIT(applet_cur_queue);
if (!applets_active_queue)
return;
HA_SPIN_LOCK(APPLETS_LOCK, &applet_active_lock);
if (!(active_applets_mask & tid_bit)) {
HA_SPIN_UNLOCK(APPLETS_LOCK, &applet_active_lock);
return;
}
curr = LIST_NEXT(&applet_active_queue, typeof(curr), runq);
while (&curr->runq != &applet_active_queue) {

View File

@ -2307,7 +2307,7 @@ static void run_poll_loop()
break;
/* expire immediately if events are pending */
if (fd_cache_num || (active_tasks_mask & tid_bit) || signal_queue_len || applets_active_queue)
if (fd_cache_num || (active_tasks_mask & tid_bit) || signal_queue_len || (active_applets_mask & tid_bit))
next = now_ms;
/* The poller will ensure it returns around <next> */