Catch IOError and OSError during poll.unregister, because conditions exist where we'll unregister twice.
This commit is contained in:
@@ -65,6 +65,7 @@ class BaseHub(object):
|
|||||||
'exit': [],
|
'exit': [],
|
||||||
}
|
}
|
||||||
self.lclass = FdListener
|
self.lclass = FdListener
|
||||||
|
self.debug_exceptions = True
|
||||||
|
|
||||||
def add(self, evtype, fileno, cb):
|
def add(self, evtype, fileno, cb):
|
||||||
""" Signals an intent to or write a particular file descriptor.
|
""" Signals an intent to or write a particular file descriptor.
|
||||||
@@ -226,15 +227,15 @@ class BaseHub(object):
|
|||||||
except:
|
except:
|
||||||
self.squelch_observer_exception(observer, sys.exc_info())
|
self.squelch_observer_exception(observer, sys.exc_info())
|
||||||
|
|
||||||
def _silent_squelch_timer_exception(self, timer, exc_info):
|
def squelch_generic_exception(self, exc_info):
|
||||||
pass
|
if self.debug_exceptions:
|
||||||
|
traceback.print_exception(*exc_info)
|
||||||
def _debug_squelch_timer_exception(self, timer, exc_info):
|
sys.stderr.flush()
|
||||||
traceback.print_exception(*exc_info)
|
|
||||||
sys.stderr.write("Timer raised: %r\n" % (timer,))
|
def squelch_timer_exception(self, timer, exc_info):
|
||||||
sys.stderr.flush()
|
if self.debug_exceptions:
|
||||||
|
traceback.print_exception(*exc_info)
|
||||||
squelch_timer_exception = _debug_squelch_timer_exception
|
sys.stderr.flush()
|
||||||
|
|
||||||
def _add_absolute_timer(self, when, info):
|
def _add_absolute_timer(self, when, info):
|
||||||
# the 0 placeholder makes it easy to bisect_right using (now, 1)
|
# the 0 placeholder makes it easy to bisect_right using (now, 1)
|
||||||
@@ -318,7 +319,4 @@ class BaseHub(object):
|
|||||||
self.lclass = FdListener
|
self.lclass = FdListener
|
||||||
|
|
||||||
def set_timer_exceptions(self, value):
|
def set_timer_exceptions(self, value):
|
||||||
if value:
|
self.debug_exceptions = value
|
||||||
self.squelch_timer_exception = self._debug_squelch_timer_exception
|
|
||||||
else:
|
|
||||||
self.squelch_timer_exception = self._silent_squelch_timer_exception
|
|
||||||
|
@@ -50,6 +50,10 @@ class Hub(BaseHub):
|
|||||||
self.poll.unregister(fileno)
|
self.poll.unregister(fileno)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
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):
|
def remove_descriptor(self, fileno):
|
||||||
super(Hub, self).remove_descriptor(fileno)
|
super(Hub, self).remove_descriptor(fileno)
|
||||||
@@ -57,6 +61,8 @@ class Hub(BaseHub):
|
|||||||
self.poll.unregister(fileno)
|
self.poll.unregister(fileno)
|
||||||
except (KeyError, ValueError):
|
except (KeyError, ValueError):
|
||||||
pass
|
pass
|
||||||
|
except (IOError, OSError):
|
||||||
|
self.squelch_generic_exception(sys.exc_info())
|
||||||
|
|
||||||
def wait(self, seconds=None):
|
def wait(self, seconds=None):
|
||||||
readers = self.listeners[READ]
|
readers = self.listeners[READ]
|
||||||
|
Reference in New Issue
Block a user