changeset: 94120:1544bdc409be branch: 3.4 parent: 94117:1b145e8ae4be user: Victor Stinner date: Tue Jan 13 09:58:33 2015 +0100 files: Lib/selectors.py Lib/test/test_selectors.py Misc/NEWS description: Issue #23209, #23225: selectors.BaseSelector.close() now clears its internal reference to the selector mapping to break a reference cycle. Initial patch written by Martin Richard. diff -r 1b145e8ae4be -r 1544bdc409be Lib/selectors.py --- a/Lib/selectors.py Sun Jan 11 15:51:11 2015 -0500 +++ b/Lib/selectors.py Tue Jan 13 09:58:33 2015 +0100 @@ -175,6 +175,8 @@ """ mapping = self.get_map() try: + if mapping is None: + raise KeyError return mapping[fileobj] except KeyError: raise KeyError("{!r} is not registered".format(fileobj)) from None @@ -256,6 +258,7 @@ def close(self): self._fd_to_key.clear() + self._map = None def get_map(self): return self._map diff -r 1b145e8ae4be -r 1544bdc409be Lib/test/test_selectors.py --- a/Lib/test/test_selectors.py Sun Jan 11 15:51:11 2015 -0500 +++ b/Lib/test/test_selectors.py Tue Jan 13 09:58:33 2015 +0100 @@ -180,6 +180,7 @@ s = self.SELECTOR() self.addCleanup(s.close) + mapping = s.get_map() rd, wr = self.make_socketpair() s.register(rd, selectors.EVENT_READ) @@ -188,6 +189,8 @@ s.close() self.assertRaises(KeyError, s.get_key, rd) self.assertRaises(KeyError, s.get_key, wr) + self.assertRaises(KeyError, mapping.__getitem__, rd) + self.assertRaises(KeyError, mapping.__getitem__, wr) def test_get_key(self): s = self.SELECTOR() diff -r 1b145e8ae4be -r 1544bdc409be Misc/NEWS --- a/Misc/NEWS Sun Jan 11 15:51:11 2015 -0500 +++ b/Misc/NEWS Tue Jan 13 09:58:33 2015 +0100 @@ -44,6 +44,10 @@ Library ------- +- Issue #23209, #23225: selectors.BaseSelector.close() now clears its internal + reference to the selector mapping to break a reference cycle. Initial patch + written by Martin Richard. + - Issue #21356: Make ssl.RAND_egd() optional to support LibreSSL. The availability of the function is checked during the compilation. Patch written by Bernard Spil.