@@ -126,14 +126,12 @@ def _unregister_wait(self):
126126 return
127127 self ._registered = False
128128
129+ wait_handle = self ._wait_handle
130+ self ._wait_handle = None
129131 try :
130- _overlapped .UnregisterWait (self . _wait_handle )
132+ _overlapped .UnregisterWait (wait_handle )
131133 except OSError as exc :
132- self ._wait_handle = None
133- if exc .winerror == _overlapped .ERROR_IO_PENDING :
134- # ERROR_IO_PENDING is not an error, the wait was unregistered
135- self ._unregister_wait_cb (None )
136- elif exc .winerror != _overlapped .ERROR_IO_PENDING :
134+ if exc .winerror != _overlapped .ERROR_IO_PENDING :
137135 context = {
138136 'message' : 'Failed to unregister the wait handle' ,
139137 'exception' : exc ,
@@ -142,9 +140,10 @@ def _unregister_wait(self):
142140 if self ._source_traceback :
143141 context ['source_traceback' ] = self ._source_traceback
144142 self ._loop .call_exception_handler (context )
145- else :
146- self ._wait_handle = None
147- self ._unregister_wait_cb (None )
143+ return
144+ # ERROR_IO_PENDING means that the unregister is pending
145+
146+ self ._unregister_wait_cb (None )
148147
149148 def cancel (self ):
150149 self ._unregister_wait ()
@@ -209,14 +208,12 @@ def _unregister_wait(self):
209208 return
210209 self ._registered = False
211210
211+ wait_handle = self ._wait_handle
212+ self ._wait_handle = None
212213 try :
213- _overlapped .UnregisterWaitEx (self . _wait_handle , self ._event )
214+ _overlapped .UnregisterWaitEx (wait_handle , self ._event )
214215 except OSError as exc :
215- self ._wait_handle = None
216- if exc .winerror == _overlapped .ERROR_IO_PENDING :
217- # ERROR_IO_PENDING is not an error, the wait was unregistered
218- self ._unregister_wait_cb (None )
219- elif exc .winerror != _overlapped .ERROR_IO_PENDING :
216+ if exc .winerror != _overlapped .ERROR_IO_PENDING :
220217 context = {
221218 'message' : 'Failed to unregister the wait handle' ,
222219 'exception' : exc ,
@@ -225,11 +222,11 @@ def _unregister_wait(self):
225222 if self ._source_traceback :
226223 context ['source_traceback' ] = self ._source_traceback
227224 self ._loop .call_exception_handler (context )
228- else :
229- self . _wait_handle = None
230- self . _event_fut = self . _proactor . _wait_cancel (
231- self ._event ,
232- self ._unregister_wait_cb )
225+ return
226+ # ERROR_IO_PENDING is not an error, the wait was unregistered
227+
228+ self . _event_fut = self . _proactor . _wait_cancel ( self ._event ,
229+ self ._unregister_wait_cb )
233230
234231
235232class PipeServer (object ):
@@ -409,13 +406,21 @@ def select(self, timeout=None):
409406 self ._results = []
410407 return tmp
411408
409+ def _result (self , value ):
410+ fut = futures .Future (loop = self ._loop )
411+ fut .set_result (value )
412+ return fut
413+
412414 def recv (self , conn , nbytes , flags = 0 ):
413415 self ._register_with_iocp (conn )
414416 ov = _overlapped .Overlapped (NULL )
415- if isinstance (conn , socket .socket ):
416- ov .WSARecv (conn .fileno (), nbytes , flags )
417- else :
418- ov .ReadFile (conn .fileno (), nbytes )
417+ try :
418+ if isinstance (conn , socket .socket ):
419+ ov .WSARecv (conn .fileno (), nbytes , flags )
420+ else :
421+ ov .ReadFile (conn .fileno (), nbytes )
422+ except BrokenPipeError :
423+ return self ._result (b'' )
419424
420425 def finish_recv (trans , key , ov ):
421426 try :
@@ -508,9 +513,7 @@ def accept_pipe(self, pipe):
508513 # ConnectNamePipe() failed with ERROR_PIPE_CONNECTED which means
509514 # that the pipe is connected. There is no need to wait for the
510515 # completion of the connection.
511- f = futures .Future (loop = self ._loop )
512- f .set_result (pipe )
513- return f
516+ return self ._result (pipe )
514517
515518 def finish_accept_pipe (trans , key , ov ):
516519 ov .getresult ()
0 commit comments