[Python-checkins] cpython: asyncio: be more lenient if we don't understand status returned by waitpid().

guido.van.rossum python-checkins at python.org
Tue Oct 22 00:00:52 CEST 2013


http://hg.python.org/cpython/rev/44e2e78b05f8
changeset:   86553:44e2e78b05f8
user:        Guido van Rossum <guido at dropbox.com>
date:        Mon Oct 21 15:00:44 2013 -0700
summary:
  asyncio: be more lenient if we don't understand status returned by waitpid().

This should have no effect, it's a "shouldn't happe" case.
Also tidied up some comments.

files:
  Lib/asyncio/unix_events.py                |  26 +++++-----
  Lib/test/test_asyncio/test_unix_events.py |   2 +-
  2 files changed, 14 insertions(+), 14 deletions(-)


diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -3,7 +3,6 @@
 import collections
 import errno
 import fcntl
-import functools
 import os
 import signal
 import socket
@@ -167,22 +166,26 @@
 
     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 @@
         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()
diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py
--- a/Lib/test/test_asyncio/test_unix_events.py
+++ b/Lib/test/test_asyncio/test_unix_events.py
@@ -266,7 +266,7 @@
         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)
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list