From: Guido van Rossum Date: Thu, 7 Nov 2013 16:39:28 +0000 (-0800) Subject: Optimize BaseSelector.modify(). Patch by Arnaud Faure. X-Git-Tag: v3.4.0b1~351 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d0786a1a5036c06770f1c958323387fd682e789e;p=thirdparty%2FPython%2Fcpython.git Optimize BaseSelector.modify(). Patch by Arnaud Faure. --- diff --git a/Lib/selectors.py b/Lib/selectors.py index 3638e8544c64..3971502ef28a 100644 --- a/Lib/selectors.py +++ b/Lib/selectors.py @@ -138,11 +138,14 @@ class BaseSelector(metaclass=ABCMeta): key = self._fd_to_key[_fileobj_to_fd(fileobj)] except KeyError: raise KeyError("{!r} is not registered".format(fileobj)) from None - if events != key.events or data != key.data: - # TODO: If only the data changed, use a shortcut that only - # updates the data. + if events != key.events: self.unregister(fileobj) return self.register(fileobj, events, data) + elif data != key.data: + # Use a shortcut to update the data. + key = key._replace(data=data) + self._fd_to_key[key.fd] = key + return key else: return key diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py index fd0481d83f51..c64c87aa3f7b 100644 --- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -6,6 +6,7 @@ import socket from test import support from time import sleep import unittest +import unittest.mock try: from time import monotonic as time except ImportError: @@ -124,6 +125,15 @@ class BaseSelectorTestCase(unittest.TestCase): # modify unknown file obj self.assertRaises(KeyError, s.modify, 999999, selectors.EVENT_READ) + # modify use a shortcut + d3 = object() + s.register = unittest.mock.Mock() + s.unregister = unittest.mock.Mock() + + s.modify(rd, selectors.EVENT_READ, d3) + self.assertFalse(s.register.called) + self.assertFalse(s.unregister.called) + def test_close(self): s = self.SELECTOR() self.addCleanup(s.close)