From: Zac Medico Date: Fri, 17 Feb 2012 03:08:07 +0000 (-0800) Subject: EventLoop: wakeup poll loop to receive sigchild X-Git-Tag: v2.2.0_alpha87~18 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=bbcfd4e2ad7f9d97ee7bb027b5345c2d5bbb3997;p=portage.git 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. --- 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: