]> granicus.if.org Git - python/commitdiff
asyncio: be more lenient if we don't understand status returned by waitpid().
authorGuido van Rossum <guido@dropbox.com>
Mon, 21 Oct 2013 22:00:44 +0000 (15:00 -0700)
committerGuido van Rossum <guido@dropbox.com>
Mon, 21 Oct 2013 22:00:44 +0000 (15:00 -0700)
This should have no effect, it's a "shouldn't happe" case.
Also tidied up some comments.

Lib/asyncio/unix_events.py
Lib/test/test_asyncio/test_unix_events.py

index b4e269924d5baf9c8b5f7fb49dffd304276942d1..8c0e09ad12dad6999cb0ab0744deffa87bd6b557 100644 (file)
@@ -3,7 +3,6 @@
 import collections
 import errno
 import fcntl
-import functools
 import os
 import signal
 import socket
@@ -167,22 +166,26 @@ class SelectorEventLoop(selector_events.BaseSelectorEventLoop):
 
     def _sig_chld(self):
         try:
-            # because of signal coalescing, we must keep calling waitpid() as
-            # long as we're able to reap a child
+            # Because of signal coalescing, we must keep calling waitpid() as
+            # long as we're able to reap a child.
             while True:
                 try:
                     pid, status = os.waitpid(-1, os.WNOHANG)
                 except ChildProcessError:
-                    break
+                    break  # No more child processes exist.
                 if pid == 0:
-                    break
+                    break  # All remaining child processes are still alive.
                 elif os.WIFSIGNALED(status):
+                    # A child process died because of a signal.
                     returncode = -os.WTERMSIG(status)
                 elif os.WIFEXITED(status):
+                    # A child process exited (e.g. sys.exit()).
                     returncode = os.WEXITSTATUS(status)
                 else:
-                    # shouldn't happen
-                    continue
+                    # A child exited, but we don't understand its status.
+                    # This shouldn't happen, but if it does, let's just
+                    # return that status; perhaps that helps debug it.
+                    returncode = status
                 transp = self._subprocesses.get(pid)
                 if transp is not None:
                     transp._process_exited(returncode)
@@ -480,18 +483,15 @@ class _UnixSubprocessTransport(transports.SubprocessTransport):
         loop = self._loop
         if proc.stdin is not None:
             transp, proto = yield from loop.connect_write_pipe(
-                functools.partial(
-                    _UnixWriteSubprocessPipeProto, self, STDIN),
+                lambda: _UnixWriteSubprocessPipeProto(self, STDIN),
                 proc.stdin)
         if proc.stdout is not None:
             transp, proto = yield from loop.connect_read_pipe(
-                functools.partial(
-                    _UnixReadSubprocessPipeProto, self, STDOUT),
+                lambda: _UnixReadSubprocessPipeProto(self, STDOUT),
                 proc.stdout)
         if proc.stderr is not None:
             transp, proto = yield from loop.connect_read_pipe(
-                functools.partial(
-                    _UnixReadSubprocessPipeProto, self, STDERR),
+                lambda: _UnixReadSubprocessPipeProto(self, STDERR),
                 proc.stderr)
         if not self._pipes:
             self._try_connected()
index 834df81163fb402c254ebc535380ac43a17d1dab..27e70c6d2b1dc5cf25436829f782741dbac2d9b9 100644 (file)
@@ -266,7 +266,7 @@ class SelectorEventLoopTests(unittest.TestCase):
         self.loop._subprocesses[7] = transp
 
         self.loop._sig_chld()
-        self.assertFalse(transp._process_exited.called)
+        self.assertTrue(transp._process_exited.called)
         self.assertFalse(m_WEXITSTATUS.called)
         self.assertFalse(m_WTERMSIG.called)