mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-24 23:31:40 +02:00
This applicationn specific flag was added in 2.4-dev by commit 6fa8bcdc7 ("MINOR: task: add an application specific flag to the state: TASK_F_USR1") to help preserve a the idle connections status across wakeup calls. While the code to do this was OK for tasklets, it was wrong for tasks, as in an effort not to lose it when setting the RUNNING flag (that tasklets don't have), it ended up being inconditionally set. It just happens that for now no regular tasks use it, only tasklets. This fix makes sure we always atomically perform (state & flags | running) there, using a CAS. It also does it for tasklets because it was possible to lose some such flags if set by another thread, even though this should not happen with current code. In order to make the code more readable (and avoid the previous mistake of repeated flags in the bit field), a new TASK_PERSISTENT aggregate was declared in task.h for this. In practice the CAS is cheap here because task states are stable or convergent so the loop will almost never be taken. This should be backported to 2.4.