]> granicus.if.org Git - python/commitdiff
asyncio: Fix ProactorEventLoop.start_serving_pipe()
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 26 Jan 2015 14:03:20 +0000 (15:03 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Mon, 26 Jan 2015 14:03:20 +0000 (15:03 +0100)
If a client connected before the server was closed: drop the client (close the
pipe) and exit.

Lib/asyncio/windows_events.py

index 6c7e0580422b0e573a7d1de9eff38be462deb885..109f5d3f4b897586c3769ccb12be515030491b69 100644 (file)
@@ -257,7 +257,7 @@ class PipeServer(object):
 
     def _server_pipe_handle(self, first):
         # Return a wrapper for a new pipe handle.
-        if self._address is None:
+        if self.closed():
             return None
         flags = _winapi.PIPE_ACCESS_DUPLEX | _winapi.FILE_FLAG_OVERLAPPED
         if first:
@@ -273,6 +273,9 @@ class PipeServer(object):
         self._free_instances.add(pipe)
         return pipe
 
+    def closed(self):
+        return (self._address is None)
+
     def close(self):
         if self._accept_pipe_future is not None:
             self._accept_pipe_future.cancel()
@@ -325,12 +328,21 @@ class ProactorEventLoop(proactor_events.BaseProactorEventLoop):
                 if f:
                     pipe = f.result()
                     server._free_instances.discard(pipe)
+
+                    if server.closed():
+                        # A client connected before the server was closed:
+                        # drop the client (close the pipe) and exit
+                        pipe.close()
+                        return
+
                     protocol = protocol_factory()
                     self._make_duplex_pipe_transport(
                         pipe, protocol, extra={'addr': address})
+
                 pipe = server._get_unconnected_pipe()
                 if pipe is None:
                     return
+
                 f = self._proactor.accept_pipe(pipe)
             except OSError as exc:
                 if pipe and pipe.fileno() != -1: