@@ -24,6 +24,8 @@ def __init__(self, limit, loop):
24
24
self ._limit = limit
25
25
self .stdin = self .stdout = self .stderr = None
26
26
self ._transport = None
27
+ self ._process_exited = False
28
+ self ._pipe_fds = []
27
29
28
30
def __repr__ (self ):
29
31
info = [self .__class__ .__name__ ]
@@ -43,12 +45,14 @@ def connection_made(self, transport):
43
45
self .stdout = streams .StreamReader (limit = self ._limit ,
44
46
loop = self ._loop )
45
47
self .stdout .set_transport (stdout_transport )
48
+ self ._pipe_fds .append (1 )
46
49
47
50
stderr_transport = transport .get_pipe_transport (2 )
48
51
if stderr_transport is not None :
49
52
self .stderr = streams .StreamReader (limit = self ._limit ,
50
53
loop = self ._loop )
51
54
self .stderr .set_transport (stderr_transport )
55
+ self ._pipe_fds .append (2 )
52
56
53
57
stdin_transport = transport .get_pipe_transport (0 )
54
58
if stdin_transport is not None :
@@ -86,9 +90,18 @@ def pipe_connection_lost(self, fd, exc):
86
90
else :
87
91
reader .set_exception (exc )
88
92
93
+ if fd in self ._pipe_fds :
94
+ self ._pipe_fds .remove (fd )
95
+ self ._maybe_close_transport ()
96
+
89
97
def process_exited (self ):
90
- self ._transport .close ()
91
- self ._transport = None
98
+ self ._process_exited = True
99
+ self ._maybe_close_transport ()
100
+
101
+ def _maybe_close_transport (self ):
102
+ if len (self ._pipe_fds ) == 0 and self ._process_exited :
103
+ self ._transport .close ()
104
+ self ._transport = None
92
105
93
106
94
107
class Process :
0 commit comments