]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
asyncio: Add close() back to Unix selector event loop, to remove all signal handlers...
authorGuido van Rossum <guido@dropbox.com>
Thu, 7 Nov 2013 04:25:50 +0000 (20:25 -0800)
committerGuido van Rossum <guido@dropbox.com>
Thu, 7 Nov 2013 04:25:50 +0000 (20:25 -0800)
Lib/asyncio/unix_events.py
Lib/test/test_asyncio/test_unix_events.py

index dd57fe8e79749a398a3f8b282de2de6cbb6d16c2..f4cf6e7f2ae254d646c8269d76b0c2b3d58b2c13 100644 (file)
@@ -48,6 +48,11 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
     def _socketpair(self):
         return socket.socketpair()
 
+    def close(self):
+        for sig in list(self._signal_handlers):
+            self.remove_signal_handler(sig)
+        super().close()
+
     def add_signal_handler(self, sig, callback, *args):
         """Add a handler for a signal.  UNIX only.
 
index a4d835e3f4c1bca73ad703357b94dcc870da1dda..42eba8d6932643fa2b89f879b4b2d01108eff1e2 100644 (file)
@@ -183,6 +183,22 @@ class SelectorEventLoopTests(unittest.TestCase):
         self.assertRaises(
             RuntimeError, self.loop.remove_signal_handler, signal.SIGHUP)
 
+    @unittest.mock.patch('asyncio.unix_events.signal')
+    def test_close(self, m_signal):
+        m_signal.NSIG = signal.NSIG
+
+        self.loop.add_signal_handler(signal.SIGHUP, lambda: True)
+        self.loop.add_signal_handler(signal.SIGCHLD, lambda: True)
+
+        self.assertEqual(len(self.loop._signal_handlers), 2)
+
+        m_signal.set_wakeup_fd.reset_mock()
+
+        self.loop.close()
+
+        self.assertEqual(len(self.loop._signal_handlers), 0)
+        m_signal.set_wakeup_fd.assert_called_once_with(-1)
+
 
 class UnixReadPipeTransportTests(unittest.TestCase):