mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
bpo-30014: make poll-like selector's modify() method faster (#1030)
* #30014: make selectors.DefaultSelector.modify() faster by relying on selector's modify() method instead of un/register()ing the fd * #30014: add unit test * speedup poll/epoll/devpoll modify() method by using internal modify() call * update doc * address PR comments * update NEWS entries * use != instead of 'is not'
This commit is contained in:
parent
894a654a9c
commit
fbfaa6fd57
4 changed files with 62 additions and 1 deletions
|
@ -175,6 +175,33 @@ class BaseSelectorTestCase(unittest.TestCase):
|
|||
self.assertFalse(s.register.called)
|
||||
self.assertFalse(s.unregister.called)
|
||||
|
||||
def test_modify_unregister(self):
|
||||
# Make sure the fd is unregister()ed in case of error on
|
||||
# modify(): http://bugs.python.org/issue30014
|
||||
if self.SELECTOR.__name__ == 'EpollSelector':
|
||||
patch = unittest.mock.patch(
|
||||
'selectors.EpollSelector._selector_cls')
|
||||
elif self.SELECTOR.__name__ == 'PollSelector':
|
||||
patch = unittest.mock.patch(
|
||||
'selectors.PollSelector._selector_cls')
|
||||
elif self.SELECTOR.__name__ == 'DevpollSelector':
|
||||
patch = unittest.mock.patch(
|
||||
'selectors.DevpollSelector._selector_cls')
|
||||
else:
|
||||
raise self.skipTest("")
|
||||
|
||||
with patch as m:
|
||||
m.return_value.modify = unittest.mock.Mock(
|
||||
side_effect=ZeroDivisionError)
|
||||
s = self.SELECTOR()
|
||||
self.addCleanup(s.close)
|
||||
rd, wr = self.make_socketpair()
|
||||
s.register(rd, selectors.EVENT_READ)
|
||||
self.assertEqual(len(s._map), 1)
|
||||
with self.assertRaises(ZeroDivisionError):
|
||||
s.modify(rd, selectors.EVENT_WRITE)
|
||||
self.assertEqual(len(s._map), 0)
|
||||
|
||||
def test_close(self):
|
||||
s = self.SELECTOR()
|
||||
self.addCleanup(s.close)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue