diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2015-01-14 01:10:33 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2015-01-14 01:10:33 (GMT) |
commit | f651a604075c2dc9a2d7f3d3bd74da374ff8a696 (patch) | |
tree | 1fd5b58dcc596b6d4b26b9904076f391040f4f3e /Lib/asyncio/subprocess.py | |
parent | c2c12e433aa47149c692eef5e5debd7c475b04c7 (diff) | |
download | cpython-f651a604075c2dc9a2d7f3d3bd74da374ff8a696.zip cpython-f651a604075c2dc9a2d7f3d3bd74da374ff8a696.tar.gz cpython-f651a604075c2dc9a2d7f3d3bd74da374ff8a696.tar.bz2 |
Python issue #23173: sync with Tulip
* If an exception is raised during the creation of a subprocess, kill the
subprocess (close pipes, kill and read the return status). Log an error in
such case.
* Fix SubprocessStreamProtocol.connection_made() to handle cancelled waiter.
Add unit test cancelling subprocess methods.
Diffstat (limited to 'Lib/asyncio/subprocess.py')
-rw-r--r-- | Lib/asyncio/subprocess.py | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index a8ad03c..a028339 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -60,7 +60,9 @@ class SubprocessStreamProtocol(streams.FlowControlMixin, protocol=self, reader=None, loop=self._loop) - self.waiter.set_result(None) + + if not self.waiter.cancelled(): + self.waiter.set_result(None) def pipe_data_received(self, fd, data): if fd == 1: @@ -216,7 +218,11 @@ def create_subprocess_shell(cmd, stdin=None, stdout=None, stderr=None, protocol_factory, cmd, stdin=stdin, stdout=stdout, stderr=stderr, **kwds) - yield from protocol.waiter + try: + yield from protocol.waiter + except: + transport._kill_wait() + raise return Process(transport, protocol, loop) @coroutine @@ -232,5 +238,9 @@ def create_subprocess_exec(program, *args, stdin=None, stdout=None, program, *args, stdin=stdin, stdout=stdout, stderr=stderr, **kwds) - yield from protocol.waiter + try: + yield from protocol.waiter + except: + transport._kill_wait() + raise return Process(transport, protocol, loop) |