sd-event: re-check new epoll events when a child event is queued
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 8 Mar 2021 06:39:53 +0000 (15:39 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 11 Mar 2021 14:09:04 +0000 (23:09 +0900)
commit84e998c112ff18bba786660bd6c1f96f62a77ffe
treedf8acc251577e543a8aad0ce22cc4c8ec1849a0d
parent7fe11e84c2702835cf063c29e0500680629a41de
sd-event: re-check new epoll events when a child event is queued

Previously, when a process outputs something and exit just after
epoll_wait() but before process_child(), then the IO event is ignored
even if the IO event has higher priority. See #18190.

This can be solved by checking epoll event again after process_child().

However, there exists a possibility that another process outputs and
exits just after process_child() but before the second epoll_wait().
When the IO event has lower priority than the child event, still IO
event is processed.

So, this makes new epoll events and child events are checked in a loop
until no new event is detected. To prevent an infinite loop, the number
of maximum trial is set to 10.

Fixes #18190.
src/libsystemd/sd-event/sd-event.c