[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