Skip to content

Commit c63eb05

Browse files
committed
revent: Handlers default to priority 0 (not None)
Previously, handlers defaulted to priority None, which is less than any integer, so they'd always be called last. This meant that it wasn't possible to set another handler to be called *after* a default one (not reliably, anyway). Now, handlers default to priority 0, so it's totally possible -- just add handler with priority -1. The cost here is mostly an extra hash lookup at handler-add time. This could be swapped for an extra list lookup at add and event-raise time...
1 parent 70dd6e5 commit c63eb05

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

pox/lib/revent/revent.py

+15-5
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ def foo (self):
100100
# handler set will not keep the source (publisher) alive.
101101
import weakref
102102

103+
DEFAULT_PRIORITY = 0
104+
103105

104106
class ReventError (RuntimeError):
105107
"""
@@ -228,6 +230,10 @@ def _eventMixin_init (self):
228230
setattr(self, "_eventMixin_events", True)
229231
if not hasattr(self, "_eventMixin_handlers"):
230232
setattr(self, "_eventMixin_handlers", {})
233+
if not hasattr(self, "_eventMixin_prioritized"):
234+
setattr(self, "_eventMixin_prioritized", set())
235+
#TODO: Avoid extra hash lookup by putting priority info on
236+
# the list of handlers instead of separate attribute.
231237

232238
def raiseEventNoErrors (self, event, *args, **kw):
233239
"""
@@ -388,7 +394,7 @@ def addListenerByName (self, *args, **kw):
388394
return self.addListener(*args,**kw)
389395

390396
def add_listener (self, handler, event_type=None, event_name=None,
391-
once=False, weak=False, priority=None):
397+
once=False, weak=False, priority=DEFAULT_PRIORITY):
392398
"""
393399
Add an event handler for an event triggered by this object (subscribe).
394400
@@ -407,7 +413,7 @@ def add_listener (self, handler, event_type=None, event_name=None,
407413
priority=priority)
408414

409415
def addListener (self, eventType, handler, once=False, weak=False,
410-
priority=None, byName=False):
416+
priority=DEFAULT_PRIORITY, byName=False):
411417
"""
412418
Add an event handler for an event triggered by this object (subscribe).
413419
@@ -464,8 +470,10 @@ def addListener (self, eventType, handler, once=False, weak=False,
464470
entry = (priority, handler, once, eid)
465471

466472
handlers.append(entry)
467-
if priority is not None:
473+
if ( (priority != DEFAULT_PRIORITY) or
474+
(eventType in self._eventMixin_prioritized) ):
468475
# If priority is specified, sort the event handlers
476+
self._eventMixin_prioritized.add(eventType)
469477
handlers.sort(reverse = True, key = operator.itemgetter(0))
470478

471479
return (eventType,eid)
@@ -481,7 +489,8 @@ def listenTo (self, source, *args, **kv):
481489
"""
482490
return autoBindEvents(self, source, *args, **kv)
483491

484-
def addListeners (self, sink, prefix='', weak=False, priority=None):
492+
def addListeners (self, sink, prefix='', weak=False,
493+
priority=DEFAULT_PRIORITY):
485494
"""
486495
Automatically subscribe sink to our events.
487496
@@ -499,7 +508,8 @@ def clearHandlers(self):
499508
self._eventMixin_handlers = {}
500509

501510

502-
def autoBindEvents (sink, source, prefix='', weak=False, priority=None):
511+
def autoBindEvents (sink, source, prefix='', weak=False,
512+
priority=DEFAULT_PRIORITY):
503513
"""
504514
Automatically set up listeners on sink for events raised by source.
505515

0 commit comments

Comments
 (0)