From c9df573099115166d31c6cd399ff93d8d61a1c90 Mon Sep 17 00:00:00 2001 From: benoitc Date: Fri, 1 Mar 2013 10:08:08 +0100 Subject: [PATCH] simplify the way we retrieve the vents don't reassing the queue event. While I'm here log exception callbacks. --- gaffer/events.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/gaffer/events.py b/gaffer/events.py index da3e3d6..b49a419 100644 --- a/gaffer/events.py +++ b/gaffer/events.py @@ -118,11 +118,15 @@ """ from collections import deque +import logging import pyuv from .loop import patch_loop +LOGGER = logging.getLogger("gaffer") + + class EventEmitter(object): """ Many events happend in gaffer. For example a process will emist the events "start", "stop", "exit". @@ -231,15 +235,17 @@ def _dispatch_event(self): self._spinner.start(lambda h: None) def _send(self, handle): - queue, self._queue = self._queue, deque(maxlen=self._queue.maxlen) - wqueue, self._wqueue = self._wqueue, deque(maxlen=self._wqueue.maxlen) + lwqueue = len(self._wqueue) + lqueue = len(self._queue) - for evtype, args, kwargs in wqueue: + for i in range(lwqueue): + evtype, args, kwargs = self._wqueue.popleft() if self._wildcards: self._wildcards = self._send_listeners(evtype, self._wildcards.copy(), *args, **kwargs) - for pattern, evtype, args, kwargs in queue: + for i in range(lqueue): + pattern, evtype, args, kwargs = self._queue.popleft() # emit the event to all listeners if pattern in self._events: self._events[pattern] = self._send_listeners(evtype, @@ -253,6 +259,8 @@ def _send_listeners(self, evtype, listeners, *args, **kwargs): try: listener(evtype, *args, **kwargs) except Exception: # we ignore all exception + LOGGER.exception('exception calling listener callback for %r', + self) to_remove.append(listener) if once: