]> git.ipfire.org Git - thirdparty/haproxy.git/commit
MEDIUM: tasks: check the global task mask instead of the thread number
authorWilly Tarreau <w@1wt.eu>
Fri, 14 Dec 2018 14:49:45 +0000 (15:49 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 14 Dec 2018 14:49:45 +0000 (15:49 +0100)
commit1ee55fddea19b9ec8f26bd3ec62ef3fc6d2ad25a
tree60ebbf9e6bc752c38f0b668d4ac7d4618d988dcc
parenta1214a501fd874300b816ee070634704ec0d9cf6
MEDIUM: tasks: check the global task mask instead of the thread number

When deciding whether to scan the global run queue or not, we currently
check the configured threads number, and if it's 1 we skip the queue
since it's not supposed to be used. However when running with a master
process and multiple threads in the workers, the master will turn this
number back to 1 while some task wakeups might possibly have set bits
in the global tasks mask, thus causing active_tasks_mask to have one
bit permanently set, preventing the process from sleeping.

Instead of checking global.nbthread, let's check for the current
thread's bit in global_tasks_mask. First it will make this part of the
code more consistent, working like a test and set operation, it will
solve the issue with master+nbthread and as a bonus it will save a
lock/unlock for each scheduler call when the thread doesn't have a
task in the global run queue.
src/task.c