summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorJulien Duponchelle <julien@duponchelle.info>2017-12-19 12:23:17 (GMT)
committerYury Selivanov <yury@magic.io>2017-12-19 12:23:17 (GMT)
commit319c0345cdd8fddb49d235462e71883f1dd51b99 (patch)
tree5e684357737be745316522643f1f77da6b05269d /Lib
parent36c2c044782997520df7fc5604742a615ccf6b17 (diff)
downloadcpython-319c0345cdd8fddb49d235462e71883f1dd51b99.zip
cpython-319c0345cdd8fddb49d235462e71883f1dd51b99.tar.gz
cpython-319c0345cdd8fddb49d235462e71883f1dd51b99.tar.bz2
bpo-29711: Fix stop_serving in proactor loop kill all listening servers (#431)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/asyncio/proactor_events.py4
-rw-r--r--Lib/test/test_asyncio/test_proactor_events.py19
2 files changed, 18 insertions, 5 deletions
diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
index 915ad1a..7044437 100644
--- a/Lib/asyncio/proactor_events.py
+++ b/Lib/asyncio/proactor_events.py
@@ -536,6 +536,8 @@ class BaseProactorEventLoop(base_events.BaseEventLoop):
self._accept_futures.clear()
def _stop_serving(self, sock):
- self._stop_accept_futures()
+ future = self._accept_futures.pop(sock.fileno(), None)
+ if future:
+ future.cancel()
self._proactor._stop_serving(sock)
sock.close()
diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py
index 47ebcad..82bff28 100644
--- a/Lib/test/test_asyncio/test_proactor_events.py
+++ b/Lib/test/test_asyncio/test_proactor_events.py
@@ -567,10 +567,21 @@ class BaseProactorEventLoopTests(test_utils.TestCase):
self.assertTrue(self.sock.close.called)
def test_stop_serving(self):
- sock = mock.Mock()
- self.loop._stop_serving(sock)
- self.assertTrue(sock.close.called)
- self.proactor._stop_serving.assert_called_with(sock)
+ sock1 = mock.Mock()
+ future1 = mock.Mock()
+ sock2 = mock.Mock()
+ future2 = mock.Mock()
+ self.loop._accept_futures = {
+ sock1.fileno(): future1,
+ sock2.fileno(): future2
+ }
+
+ self.loop._stop_serving(sock1)
+ self.assertTrue(sock1.close.called)
+ self.assertTrue(future1.cancel.called)
+ self.proactor._stop_serving.assert_called_with(sock1)
+ self.assertFalse(sock2.close.called)
+ self.assertFalse(future2.cancel.called)
if __name__ == '__main__':