diff --git a/eventlet/hubs/epolls.py b/eventlet/hubs/epolls.py index 036682c..e3e03d8 100644 --- a/eventlet/hubs/epolls.py +++ b/eventlet/hubs/epolls.py @@ -31,4 +31,6 @@ class Hub(poll.Hub): if not oldlisteners: # Means we've added a new listener self.register(fileno, new=True) + else: + self.register(fileno, new=False) return listener diff --git a/eventlet/hubs/poll.py b/eventlet/hubs/poll.py index d576a34..c9925e3 100644 --- a/eventlet/hubs/poll.py +++ b/eventlet/hubs/poll.py @@ -23,11 +23,8 @@ class Hub(BaseHub): self.modify = self.poll.register def add(self, evtype, fileno, cb): - oldlisteners = bool(self.listeners[evtype].get(fileno)) listener = super(Hub, self).add(evtype, fileno, cb) - if not oldlisteners: - # Means we've added a new listener - self.register(fileno, new=True) + self.register(fileno, new=True) return listener def remove(self, listener): @@ -37,14 +34,17 @@ class Hub(BaseHub): def register(self, fileno, new=False): mask = 0 if self.listeners[READ].get(fileno): - mask |= READ_MASK + mask |= READ_MASK | EXC_MASK if self.listeners[WRITE].get(fileno): - mask |= WRITE_MASK + mask |= WRITE_MASK | EXC_MASK if mask: if new: self.poll.register(fileno, mask) else: - self.modify(fileno, mask) + try: + self.modify(fileno, mask) + except (IOError, OSError): + self.poll.register(fileno, mask) else: try: self.poll.unregister(fileno) @@ -53,7 +53,7 @@ class Hub(BaseHub): except (IOError, OSError): # raised if we try to remove a fileno that was # already removed/invalid - self.squelch_generic_exception(sys.exc_info()) + pass def remove_descriptor(self, fileno): super(Hub, self).remove_descriptor(fileno) @@ -62,7 +62,9 @@ class Hub(BaseHub): except (KeyError, ValueError): pass except (IOError, OSError): - self.squelch_generic_exception(sys.exc_info()) + # raised if we try to remove a fileno that was + # already removed/invalid + pass def wait(self, seconds=None): readers = self.listeners[READ]