]> granicus.if.org Git - python/commitdiff
asyncio, Tulip issue 204: Fix IocpProactor.recv()
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 26 Jan 2015 21:30:49 +0000 (22:30 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Mon, 26 Jan 2015 21:30:49 +0000 (22:30 +0100)
If ReadFile() fails with ERROR_BROKEN_PIPE, the operation is not pending: don't
register the overlapped.

I don't know if WSARecv() can fail with ERROR_BROKEN_PIPE. Since
Overlapped.WSARecv() already handled ERROR_BROKEN_PIPE, let me guess that it
has the same behaviour than ReadFile().

Lib/asyncio/windows_events.py
Modules/overlapped.c

index 8f1d9d2a1287cc8613d921d62940ef9ff7bdeb94..94aafb6f5ab0b16cb3b04b1a9fd7a98ea732302d 100644 (file)
@@ -406,13 +406,21 @@ class IocpProactor:
         self._results = []
         return tmp
 
+    def _result(self, value):
+        fut = futures.Future(loop=self._loop)
+        fut.set_result(value)
+        return fut
+
     def recv(self, conn, nbytes, flags=0):
         self._register_with_iocp(conn)
         ov = _overlapped.Overlapped(NULL)
-        if isinstance(conn, socket.socket):
-            ov.WSARecv(conn.fileno(), nbytes, flags)
-        else:
-            ov.ReadFile(conn.fileno(), nbytes)
+        try:
+            if isinstance(conn, socket.socket):
+                ov.WSARecv(conn.fileno(), nbytes, flags)
+            else:
+                ov.ReadFile(conn.fileno(), nbytes)
+        except BrokenPipeError:
+            return self._result(b'')
 
         def finish_recv(trans, key, ov):
             try:
@@ -505,9 +513,7 @@ class IocpProactor:
             # ConnectNamePipe() failed with ERROR_PIPE_CONNECTED which means
             # that the pipe is connected. There is no need to wait for the
             # completion of the connection.
-            f = futures.Future(loop=self._loop)
-            f.set_result(pipe)
-            return f
+            return self._result(pipe)
 
         def finish_accept_pipe(trans, key, ov):
             ov.getresult()
index 4661152d20bb1b58b1ed41f3d8e2351d226da63c..1a081ecb7704bdd4ef4322faab17eb7aa9099947 100644 (file)
@@ -730,7 +730,7 @@ Overlapped_ReadFile(OverlappedObject *self, PyObject *args)
     switch (err) {
         case ERROR_BROKEN_PIPE:
             mark_as_completed(&self->overlapped);
-            Py_RETURN_NONE;
+            return SetFromWindowsErr(err);
         case ERROR_SUCCESS:
         case ERROR_MORE_DATA:
         case ERROR_IO_PENDING:
@@ -789,7 +789,7 @@ Overlapped_WSARecv(OverlappedObject *self, PyObject *args)
     switch (err) {
         case ERROR_BROKEN_PIPE:
             mark_as_completed(&self->overlapped);
-            Py_RETURN_NONE;
+            return SetFromWindowsErr(err);
         case ERROR_SUCCESS:
         case ERROR_MORE_DATA:
         case ERROR_IO_PENDING: