]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Fix #1901: fix TCPServer.stop() when called twice 1902/head
authorAntoine Pitrou <antoine@python.org>
Wed, 30 Nov 2016 16:40:46 +0000 (17:40 +0100)
committerAntoine Pitrou <antoine@python.org>
Wed, 30 Nov 2016 16:40:46 +0000 (17:40 +0100)
tornado/tcpserver.py
tornado/test/tcpserver_test.py

index 54837f7a65352a664b0c34fc7d655581d7c22445..31f49359a9084020539da8ac63e3a2cda099efb3 100644 (file)
@@ -109,6 +109,7 @@ class TCPServer(object):
         self._sockets = {}  # fd -> socket object
         self._pending_sockets = []
         self._started = False
+        self._stopped = False
         self.max_buffer_size = max_buffer_size
         self.read_chunk_size = read_chunk_size
 
@@ -227,7 +228,11 @@ class TCPServer(object):
         Requests currently in progress may still continue after the
         server is stopped.
         """
+        if self._stopped:
+            return
+        self._stopped = True
         for fd, sock in self._sockets.items():
+            assert sock.fileno() == fd
             self.io_loop.remove_handler(fd)
             sock.close()
 
index c01c04ddfb2baf903a76fbf5dfa182c3c2d21172..5c51c71f0ab72d57054bbb680a4c9b97c02a05ad 100644 (file)
@@ -1,4 +1,5 @@
 from __future__ import absolute_import, division, print_function, with_statement
+
 import socket
 
 from tornado import gen
@@ -37,3 +38,11 @@ class TCPServerTest(AsyncTestCase):
                 server.stop()
             if client is not None:
                 client.close()
+
+    def test_stop_twice(self):
+        sock, port = bind_unused_port()
+        server = TCPServer()
+        server.add_socket(sock)
+        server.stop()
+        server.stop()
+