From bbcfd4e2ad7f9d97ee7bb027b5345c2d5bbb3997 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Thu, 16 Feb 2012 19:08:07 -0800 Subject: EventLoop: wakeup poll loop to receive sigchild TODO: Find out why SIGCHLD signals aren't delivered during poll calls, forcing us to wakeup in order to receive them. This fixes random hangs in poll calls since commit 1979a6cdfcd8c6bae4565982d82d862be07ba5be. --- pym/portage/util/_eventloop/EventLoop.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pym/portage/util/_eventloop/EventLoop.py b/pym/portage/util/_eventloop/EventLoop.py index 9ca529fe1..e38134258 100644 --- a/pym/portage/util/_eventloop/EventLoop.py +++ b/pym/portage/util/_eventloop/EventLoop.py @@ -19,6 +19,10 @@ class EventLoop(object): supports_multiprocessing = True + # TODO: Find out why SIGCHLD signals aren't delivered during poll + # calls, forcing us to wakeup in order to receive them. + _sigchld_interval = 250 + class _child_callback_class(SlotObject): __slots__ = ("callback", "data", "pid", "source_id") @@ -185,7 +189,14 @@ class EventLoop(object): if not self._poll_event_queue: if may_block: - timeout = self._timeout_interval + if self._child_handlers: + if self._timeout_interval is None: + timeout = self._sigchld_interval + else: + timeout = min(self._sigchld_interval, + self._timeout_interval) + else: + timeout = self._timeout_interval else: timeout = 0 try: -- cgit v1.2.3-1-g7c22