@@ -138,6 +138,7 @@ def create_pipe_connection(self, protocol_factory, address):
138138 @tasks .coroutine
139139 def start_serving_pipe (self , protocol_factory , address ):
140140 server = PipeServer (address )
141+
141142 def loop (f = None ):
142143 pipe = None
143144 try :
@@ -160,6 +161,7 @@ def loop(f=None):
160161 pipe .close ()
161162 else :
162163 f .add_done_callback (loop )
164+
163165 self .call_soon (loop )
164166 return [server ]
165167
@@ -209,6 +211,7 @@ def recv(self, conn, nbytes, flags=0):
209211 ov .WSARecv (conn .fileno (), nbytes , flags )
210212 else :
211213 ov .ReadFile (conn .fileno (), nbytes )
214+
212215 def finish (trans , key , ov ):
213216 try :
214217 return ov .getresult ()
@@ -217,6 +220,7 @@ def finish(trans, key, ov):
217220 raise ConnectionResetError (* exc .args )
218221 else :
219222 raise
223+
220224 return self ._register (ov , conn , finish )
221225
222226 def send (self , conn , buf , flags = 0 ):
@@ -226,6 +230,7 @@ def send(self, conn, buf, flags=0):
226230 ov .WSASend (conn .fileno (), buf , flags )
227231 else :
228232 ov .WriteFile (conn .fileno (), buf )
233+
229234 def finish (trans , key , ov ):
230235 try :
231236 return ov .getresult ()
@@ -234,13 +239,15 @@ def finish(trans, key, ov):
234239 raise ConnectionResetError (* exc .args )
235240 else :
236241 raise
242+
237243 return self ._register (ov , conn , finish )
238244
239245 def accept (self , listener ):
240246 self ._register_with_iocp (listener )
241247 conn = self ._get_accept_socket (listener .family )
242248 ov = _overlapped .Overlapped (NULL )
243249 ov .AcceptEx (listener .fileno (), conn .fileno ())
250+
244251 def finish_accept (trans , key , ov ):
245252 ov .getresult ()
246253 # Use SO_UPDATE_ACCEPT_CONTEXT so getsockname() etc work.
@@ -249,6 +256,7 @@ def finish_accept(trans, key, ov):
249256 _overlapped .SO_UPDATE_ACCEPT_CONTEXT , buf )
250257 conn .settimeout (listener .gettimeout ())
251258 return conn , conn .getpeername ()
259+
252260 return self ._register (ov , listener , finish_accept )
253261
254262 def connect (self , conn , address ):
@@ -264,26 +272,31 @@ def connect(self, conn, address):
264272 raise
265273 ov = _overlapped .Overlapped (NULL )
266274 ov .ConnectEx (conn .fileno (), address )
275+
267276 def finish_connect (trans , key , ov ):
268277 ov .getresult ()
269278 # Use SO_UPDATE_CONNECT_CONTEXT so getsockname() etc work.
270279 conn .setsockopt (socket .SOL_SOCKET ,
271280 _overlapped .SO_UPDATE_CONNECT_CONTEXT , 0 )
272281 return conn
282+
273283 return self ._register (ov , conn , finish_connect )
274284
275285 def accept_pipe (self , pipe ):
276286 self ._register_with_iocp (pipe )
277287 ov = _overlapped .Overlapped (NULL )
278288 ov .ConnectNamedPipe (pipe .fileno ())
289+
279290 def finish (trans , key , ov ):
280291 ov .getresult ()
281292 return pipe
293+
282294 return self ._register (ov , pipe , finish )
283295
284296 def connect_pipe (self , address ):
285297 ov = _overlapped .Overlapped (NULL )
286298 ov .WaitNamedPipeAndConnect (address , self ._iocp , ov .address )
299+
287300 def finish (err , handle , ov ):
288301 # err, handle were arguments passed to PostQueuedCompletionStatus()
289302 # in a function run in a thread pool.
@@ -296,6 +309,7 @@ def finish(err, handle, ov):
296309 raise OSError (0 , msg , None , err )
297310 else :
298311 return windows_utils .PipeHandle (handle )
312+
299313 return self ._register (ov , None , finish , wait_for_post = True )
300314
301315 def wait_for_handle (self , handle , timeout = None ):
@@ -432,8 +446,10 @@ def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs):
432446 self ._proc = windows_utils .Popen (
433447 args , shell = shell , stdin = stdin , stdout = stdout , stderr = stderr ,
434448 bufsize = bufsize , ** kwargs )
449+
435450 def callback (f ):
436451 returncode = self ._proc .poll ()
437452 self ._process_exited (returncode )
453+
438454 f = self ._loop ._proactor .wait_for_handle (int (self ._proc ._handle ))
439455 f .add_done_callback (callback )
0 commit comments