gh-87079: Warn on unintended signal wakeup fd override in asyncio (#96807)

Warn on loop initialization, when setting the wakeup fd disturbs a previously set wakeup fd, and on loop closing, when upon resetting the wakeup fd, we find it has been changed by someone else.
This commit is contained in:
Michel Hidalgo 2022-09-17 12:07:54 -03:00 committed by GitHub
parent 2cd70ffb3f
commit 0587810698
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 66 additions and 8 deletions

View file

@ -720,8 +720,12 @@ class BaseProactorEventLoopTests(test_utils.TestCase):
def test_ctor(self, socketpair):
ssock, csock = socketpair.return_value = (
mock.Mock(), mock.Mock())
with mock.patch('signal.set_wakeup_fd'):
loop = BaseProactorEventLoop(self.proactor)
with mock.patch('signal.set_wakeup_fd') as set_wakeup_fd:
set_wakeup_fd.return_value = -1000
with self.assertWarnsRegex(
ResourceWarning, 'Signal wakeup fd was already set'
):
loop = BaseProactorEventLoop(self.proactor)
self.assertIs(loop._ssock, ssock)
self.assertIs(loop._csock, csock)
self.assertEqual(loop._internal_fds, 1)
@ -740,7 +744,12 @@ class BaseProactorEventLoopTests(test_utils.TestCase):
def test_close(self):
self.loop._close_self_pipe = mock.Mock()
self.loop.close()
with mock.patch('signal.set_wakeup_fd') as set_wakeup_fd:
set_wakeup_fd.return_value = -1000
with self.assertWarnsRegex(
ResourceWarning, 'Got unexpected signal wakeup fd'
):
self.loop.close()
self.assertTrue(self.loop._close_self_pipe.called)
self.assertTrue(self.proactor.close.called)
self.assertIsNone(self.loop._proactor)