Skip to content

Commit b442130

Browse files
committed
Remove file descriptor from sets on unregister() for kqueue poller
1 parent c6beefd commit b442130

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

supervisor/poller.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ def _ignore_invalid(self, fd, eventmask):
117117
return True
118118
return False
119119

120-
121120
class KQueuePoller(BasePoller):
122121
'''
123122
Wrapper for select.kqueue()/kevent()
@@ -145,6 +144,7 @@ def register_writable(self, fd):
145144
def unregister(self, fd):
146145
kevent = select.kevent(fd, filter=(select.KQ_FILTER_READ | select.KQ_FILTER_WRITE),
147146
flags=select.KQ_EV_DELETE)
147+
self._forget_fd(fd)
148148
self._kqueue_control(fd, kevent)
149149

150150
def _kqueue_control(self, fd, kevent):
@@ -157,6 +157,13 @@ def _kqueue_control(self, fd, kevent):
157157
else:
158158
raise
159159

160+
def _forget_fd(self, fd):
161+
for collection in (self.readables, self.writables):
162+
try:
163+
collection.remove(fd)
164+
except KeyError:
165+
pass
166+
160167
def poll(self, timeout):
161168
readables, writables = [], []
162169

supervisor/tests/test_poller.py

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def test_register_readable(self):
8787
poller.register_readable(6)
8888
self.assertEqual(list(poller.readables), [6])
8989
self.assertEqual(len(kqueue.registered_kevents), 1)
90-
self.assertReadEventAdded(kqueue, kqueue.registered_kevents[0], 6)
90+
self.assertReadEventAdded(kqueue.registered_kevents[0], 6)
9191

9292
def test_register_writable(self):
9393
kqueue = DummyKQueue()
@@ -96,7 +96,21 @@ def test_register_writable(self):
9696
poller.register_writable(7)
9797
self.assertEqual(list(poller.writables), [7])
9898
self.assertEqual(len(kqueue.registered_kevents), 1)
99-
self.assertWriteEventAdded(kqueue, kqueue.registered_kevents[0], 7)
99+
self.assertWriteEventAdded(kqueue.registered_kevents[0], 7)
100+
101+
def test_unregister(self):
102+
kqueue = DummyKQueue()
103+
poller = self._makeOne(DummyOptions())
104+
poller._kqueue = kqueue
105+
poller.register_writable(7)
106+
poller.register_readable(8)
107+
poller.unregister(7)
108+
poller.unregister(100) # not registered, ignore error
109+
self.assertEqual(list(poller.writables), [])
110+
self.assertEqual(list(poller.readables), [8])
111+
self.assertWriteEventAdded(kqueue.registered_kevents[0], 7)
112+
self.assertReadEventAdded(kqueue.registered_kevents[1], 8)
113+
self.assertDeletedEvent(kqueue.registered_kevents[2], 7)
100114

101115
def test_poll_returns_readables_and_writables(self):
102116
kqueue = DummyKQueue(result=[(6, select.KQ_FILTER_READ),
@@ -168,16 +182,20 @@ def test_after_daemonize_restores_kqueue(self):
168182
poller.register_readable.assert_called_with(1)
169183
poller.register_writable.assert_called_with(3)
170184

171-
def assertReadEventAdded(self, kqueue, kevent, fd):
172-
self.assertEventAdded(kqueue, kevent, fd, select.KQ_FILTER_READ)
185+
def assertReadEventAdded(self, kevent, fd):
186+
self.assertKevent(kevent, fd, select.KQ_FILTER_READ, select.KQ_EV_ADD)
187+
188+
def assertWriteEventAdded(self, kevent, fd):
189+
self.assertKevent(kevent, fd, select.KQ_FILTER_WRITE, select.KQ_EV_ADD)
173190

174-
def assertWriteEventAdded(self, kqueue, kevent, fd):
175-
self.assertEventAdded(kqueue, kevent, fd, select.KQ_FILTER_WRITE)
191+
def assertDeletedEvent(self, kevent, fd):
192+
self.assertKevent(kevent, fd, select.KQ_FILTER_READ | select.KQ_FILTER_WRITE,
193+
select.KQ_EV_DELETE)
176194

177-
def assertEventAdded(self, kqueue, kevent, fd, filter_spec):
178-
self.assertEqual(kevent.ident, fd)
179-
self.assertEqual(kevent.filter, filter_spec)
180-
self.assertEqual(kevent.flags, select.KQ_EV_ADD)
195+
def assertKevent(self, kevent, ident, filter, flags):
196+
self.assertEqual(kevent.ident, ident)
197+
self.assertEqual(kevent.filter, filter)
198+
self.assertEqual(kevent.flags, flags)
181199

182200

183201
if implements_poll():

0 commit comments

Comments
 (0)