summaryrefslogtreecommitdiffstats
path: root/Lib/asyncio/subprocess.py
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-01-14 01:10:33 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-01-14 01:10:33 (GMT)
commitf651a604075c2dc9a2d7f3d3bd74da374ff8a696 (patch)
tree1fd5b58dcc596b6d4b26b9904076f391040f4f3e /Lib/asyncio/subprocess.py
parentc2c12e433aa47149c692eef5e5debd7c475b04c7 (diff)
downloadcpython-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.py16
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)