]> granicus.if.org Git - python/commitdiff
Optimize BaseSelector.modify(). Patch by Arnaud Faure.
authorGuido van Rossum <guido@dropbox.com>
Thu, 7 Nov 2013 16:39:28 +0000 (08:39 -0800)
committerGuido van Rossum <guido@dropbox.com>
Thu, 7 Nov 2013 16:39:28 +0000 (08:39 -0800)
Lib/selectors.py
Lib/test/test_selectors.py

index 3638e8544c64987bc574c21d54af89213b7558a3..3971502ef28aab7aabd8d240d5893984d692aa5c 100644 (file)
@@ -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
 
index fd0481d83f51f2de9ae7b4c16cab2fd8a90a0d16..c64c87aa3f7b1a9fa99c6ffea2745852e6f689f6 100644 (file)
@@ -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)