Catch IOError and OSError during poll.unregister, because conditions exist where we'll unregister twice.

This commit is contained in:
Ryan Williams
2010-02-09 16:34:40 -08:00
parent d0df89d182
commit 9edb2e2d89
2 changed files with 17 additions and 13 deletions

View File

@@ -65,6 +65,7 @@ class BaseHub(object):
'exit': [],
}
self.lclass = FdListener
self.debug_exceptions = True
def add(self, evtype, fileno, cb):
""" Signals an intent to or write a particular file descriptor.
@@ -226,15 +227,15 @@ class BaseHub(object):
except:
self.squelch_observer_exception(observer, sys.exc_info())
def _silent_squelch_timer_exception(self, timer, exc_info):
pass
def _debug_squelch_timer_exception(self, timer, exc_info):
traceback.print_exception(*exc_info)
sys.stderr.write("Timer raised: %r\n" % (timer,))
sys.stderr.flush()
squelch_timer_exception = _debug_squelch_timer_exception
def squelch_generic_exception(self, exc_info):
if self.debug_exceptions:
traceback.print_exception(*exc_info)
sys.stderr.flush()
def squelch_timer_exception(self, timer, exc_info):
if self.debug_exceptions:
traceback.print_exception(*exc_info)
sys.stderr.flush()
def _add_absolute_timer(self, when, info):
# the 0 placeholder makes it easy to bisect_right using (now, 1)
@@ -318,7 +319,4 @@ class BaseHub(object):
self.lclass = FdListener
def set_timer_exceptions(self, value):
if value:
self.squelch_timer_exception = self._debug_squelch_timer_exception
else:
self.squelch_timer_exception = self._silent_squelch_timer_exception
self.debug_exceptions = value

View File

@@ -50,6 +50,10 @@ class Hub(BaseHub):
self.poll.unregister(fileno)
except KeyError:
pass
except (IOError, OSError):
# raised if we try to remove a fileno that was
# already removed/invalid
self.squelch_generic_exception(sys.exc_info())
def remove_descriptor(self, fileno):
super(Hub, self).remove_descriptor(fileno)
@@ -57,6 +61,8 @@ class Hub(BaseHub):
self.poll.unregister(fileno)
except (KeyError, ValueError):
pass
except (IOError, OSError):
self.squelch_generic_exception(sys.exc_info())
def wait(self, seconds=None):
readers = self.listeners[READ]