Skip to content

Commit

Permalink
selectors: avoid reference cycle with _SelectorMapping
Browse files Browse the repository at this point in the history
See #117
  • Loading branch information
colesbury committed Aug 14, 2023
1 parent 3162ce0 commit af329af
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 6 deletions.
10 changes: 6 additions & 4 deletions Lib/selectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,7 @@ class _BaseSelectorImpl(BaseSelector):
def __init__(self):
# this maps file descriptors to keys
self._fd_to_key = {}
# read-only mapping returned by get_map()
self._map = _SelectorMapping(self)
self._closed = False

def _fileobj_lookup(self, fileobj):
"""Return a file descriptor from a file object.
Expand Down Expand Up @@ -268,10 +267,13 @@ def modify(self, fileobj, events, data=None):

def close(self):
self._fd_to_key.clear()
self._map = None
self._closed = True

def get_map(self):
return self._map
# read-only mapping returned by get_map()
if self._closed:
return None
return _SelectorMapping(self)

def _key_from_fd(self, fd):
"""Return the key associated to a given file descriptor.
Expand Down
4 changes: 2 additions & 2 deletions Lib/test/test_selectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,10 +198,10 @@ def test_modify_unregister(self):
self.addCleanup(s.close)
rd, wr = self.make_socketpair()
s.register(rd, selectors.EVENT_READ)
self.assertEqual(len(s._map), 1)
self.assertEqual(len(s.get_map()), 1)
with self.assertRaises(ZeroDivisionError):
s.modify(rd, selectors.EVENT_WRITE)
self.assertEqual(len(s._map), 0)
self.assertEqual(len(s.get_map()), 0)

def test_close(self):
s = self.SELECTOR()
Expand Down

0 comments on commit af329af

Please sign in to comment.