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)
committerLennart Poettering <lennart@poettering.net>
Tue, 16 Mar 2021 12:35:20 +0000 (13:35 +0100)
commitefd3be9de1dc07ec743912f3c166bbf17dbb20f5
tree5321bedb9ed4550cbde5c1690eafec8e2c70d6f4
parente62636741c3a2af67cce47556b2c1ee5ed498992
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