Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c27a8af

Browse files
committed
Merge 3.4 (asyncio)
2 parents 5474d0b + 41063d2 commit c27a8af

2 files changed

Lines changed: 32 additions & 29 deletions

File tree

Lib/asyncio/windows_events.py

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

235232
class 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()

Modules/overlapped.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -730,7 +730,7 @@ Overlapped_ReadFile(OverlappedObject *self, PyObject *args)
730730
switch (err) {
731731
case ERROR_BROKEN_PIPE:
732732
mark_as_completed(&self->overlapped);
733-
Py_RETURN_NONE;
733+
return SetFromWindowsErr(err);
734734
case ERROR_SUCCESS:
735735
case ERROR_MORE_DATA:
736736
case ERROR_IO_PENDING:
@@ -789,7 +789,7 @@ Overlapped_WSARecv(OverlappedObject *self, PyObject *args)
789789
switch (err) {
790790
case ERROR_BROKEN_PIPE:
791791
mark_as_completed(&self->overlapped);
792-
Py_RETURN_NONE;
792+
return SetFromWindowsErr(err);
793793
case ERROR_SUCCESS:
794794
case ERROR_MORE_DATA:
795795
case ERROR_IO_PENDING:

0 commit comments

Comments
 (0)