The following error is known to occur with Linux kernel versions
authorZac Medico <zmedico@gentoo.org>
Mon, 18 Aug 2008 23:24:33 +0000 (23:24 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 18 Aug 2008 23:24:33 +0000 (23:24 -0000)
less than 2.6.24:

  select.error: (4, 'Interrupted system call')

This error has been observed after a SIGSTOP, followed by SIGCONT.
Treat it similar to EAGAIN if timeout is None, otherwise just return
without any events.

Thanks to Jeremy Olexa <darkside@g.o> for reporting and testing this
patch.

svn path=/main/trunk/; revision=11436

pym/_emerge/__init__.py

index cc1b42befb072b6f0fd9ed374e1b7190d079dfeb..2bb1d44285d94ddc1f29f12206083d1439f52fa3 100644 (file)
@@ -8342,7 +8342,25 @@ class PollScheduler(object):
                                not self._poll_event_handlers:
                                raise StopIteration(
                                        "timeout is None and there are no poll() event handlers")
-               self._poll_event_queue.extend(self._poll_obj.poll(timeout))
+
+               # The following error is known to occur with Linux kernel versions
+               # less than 2.6.24:
+               #
+               #   select.error: (4, 'Interrupted system call')
+               #
+               # This error has been observed after a SIGSTOP, followed by SIGCONT.
+               # Treat it similar to EAGAIN if timeout is None, otherwise just return
+               # without any events.
+               while True:
+                       try:
+                               self._poll_event_queue.extend(self._poll_obj.poll(timeout))
+                               break
+                       except select.error, e:
+                               writemsg_level("\n!!! select error: %s\n" % (e,),
+                                       level=logging.ERROR, noiselevel=-1)
+                               del e
+                               if timeout is not None:
+                                       break
 
        def _next_poll_event(self, timeout=None):
                """