Fix PollScheduler._unregister() to discard any unhandled events
authorZac Medico <zmedico@gentoo.org>
Sun, 15 Aug 2010 23:30:02 +0000 (16:30 -0700)
committerZac Medico <zmedico@gentoo.org>
Sun, 15 Aug 2010 23:30:02 +0000 (16:30 -0700)
that belong to the unregistered file, in order to prevent these
events from being erroneously delivered to a future handler
that is using a reallocated file descriptor of the same numeric
value (causing extremely confusing bugs). Note that this is was
the cause of the intermittent bug that forced me to disable
EbuildIpcDaemon by default.

pym/_emerge/PollScheduler.py

index 52a33772b27820cfcd5606658833aea6cdeaadc5..738dcc7f193dfbe5e0956a14d8be5697951fcfe9 100644 (file)
@@ -192,6 +192,19 @@ class PollScheduler(object):
        def _unregister(self, reg_id):
                f = self._poll_event_handler_ids[reg_id]
                self._poll_obj.unregister(f)
+               if self._poll_event_queue:
+                       # Discard any unhandled events that belong to this file,
+                       # in order to prevent these events from being erroneously
+                       # delivered to a future handler that is using a reallocated
+                       # file descriptor of the same numeric value (causing
+                       # extremely confusing bugs).
+                       remove = set()
+                       for event in self._poll_event_queue:
+                               if event[0] == f:
+                                       remove.add(event)
+                       if remove:
+                               self._poll_event_queue[:] = [event for event in \
+                                       self._poll_event_queue if event not in remove]
                del self._poll_event_handlers[f]
                del self._poll_event_handler_ids[reg_id]