Simplify event handling
This commit is contained in:
+15
-22
@@ -16,10 +16,8 @@ def runHandler(name, handler, *args, **kwargs):
|
|||||||
|
|
||||||
def addEvent(name, handler, priority = 100):
|
def addEvent(name, handler, priority = 100):
|
||||||
|
|
||||||
if events.get(name):
|
if not events.get(name):
|
||||||
e = events[name]
|
events[name] = []
|
||||||
else:
|
|
||||||
e = events[name] = Event(name = name, threads = 10, exc_info = True, traceback = True, lock = threading.RLock())
|
|
||||||
|
|
||||||
def createHandle(*args, **kwargs):
|
def createHandle(*args, **kwargs):
|
||||||
|
|
||||||
@@ -35,7 +33,10 @@ def addEvent(name, handler, priority = 100):
|
|||||||
|
|
||||||
return h
|
return h
|
||||||
|
|
||||||
e.handle(createHandle, priority = priority)
|
events[name].append({
|
||||||
|
'handler': createHandle,
|
||||||
|
'priority': priority,
|
||||||
|
})
|
||||||
|
|
||||||
def removeEvent(name, handler):
|
def removeEvent(name, handler):
|
||||||
e = events[name]
|
e = events[name]
|
||||||
@@ -43,6 +44,12 @@ def removeEvent(name, handler):
|
|||||||
|
|
||||||
def fireEvent(name, *args, **kwargs):
|
def fireEvent(name, *args, **kwargs):
|
||||||
if not events.get(name): return
|
if not events.get(name): return
|
||||||
|
|
||||||
|
e = Event(name = name, threads = 10, asynch = kwargs.get('async', False), exc_info = True, traceback = True, lock = threading.RLock())
|
||||||
|
|
||||||
|
for event in events[name]:
|
||||||
|
e.handle(event['handler'], priority = event['priority'])
|
||||||
|
|
||||||
#log.debug('Firing event %s', name)
|
#log.debug('Firing event %s', name)
|
||||||
try:
|
try:
|
||||||
|
|
||||||
@@ -52,6 +59,7 @@ def fireEvent(name, *args, **kwargs):
|
|||||||
'single': False, # Return single handler
|
'single': False, # Return single handler
|
||||||
'merge': False, # Merge items
|
'merge': False, # Merge items
|
||||||
'in_order': False, # Fire them in specific order, waits for the other to finish
|
'in_order': False, # Fire them in specific order, waits for the other to finish
|
||||||
|
'async': False
|
||||||
}
|
}
|
||||||
|
|
||||||
# Do options
|
# Do options
|
||||||
@@ -62,13 +70,6 @@ def fireEvent(name, *args, **kwargs):
|
|||||||
options[x] = val
|
options[x] = val
|
||||||
except: pass
|
except: pass
|
||||||
|
|
||||||
e = events[name]
|
|
||||||
|
|
||||||
# Lock this event
|
|
||||||
e.lock.acquire()
|
|
||||||
|
|
||||||
e.asynchronous = False
|
|
||||||
|
|
||||||
# Make sure only 1 event is fired at a time when order is wanted
|
# Make sure only 1 event is fired at a time when order is wanted
|
||||||
kwargs['event_order_lock'] = threading.RLock() if options['in_order'] or options['single'] else None
|
kwargs['event_order_lock'] = threading.RLock() if options['in_order'] or options['single'] else None
|
||||||
kwargs['event_return_on_result'] = options['single']
|
kwargs['event_return_on_result'] = options['single']
|
||||||
@@ -76,9 +77,6 @@ def fireEvent(name, *args, **kwargs):
|
|||||||
# Fire
|
# Fire
|
||||||
result = e(*args, **kwargs)
|
result = e(*args, **kwargs)
|
||||||
|
|
||||||
# Release lock for this event
|
|
||||||
e.lock.release()
|
|
||||||
|
|
||||||
if options['single'] and not options['merge']:
|
if options['single'] and not options['merge']:
|
||||||
results = None
|
results = None
|
||||||
|
|
||||||
@@ -140,13 +138,8 @@ def fireEvent(name, *args, **kwargs):
|
|||||||
log.error('%s: %s', (name, traceback.format_exc()))
|
log.error('%s: %s', (name, traceback.format_exc()))
|
||||||
|
|
||||||
def fireEventAsync(*args, **kwargs):
|
def fireEventAsync(*args, **kwargs):
|
||||||
try:
|
kwargs['async'] = True
|
||||||
my_thread = threading.Thread(target = fireEvent, args = args, kwargs = kwargs)
|
fireEvent(*args, **kwargs)
|
||||||
my_thread.setDaemon(True)
|
|
||||||
my_thread.start()
|
|
||||||
return True
|
|
||||||
except Exception, e:
|
|
||||||
log.error('%s: %s', (args[0], e))
|
|
||||||
|
|
||||||
def errorHandler(error):
|
def errorHandler(error):
|
||||||
etype, value, tb = error
|
etype, value, tb = error
|
||||||
|
|||||||
Reference in New Issue
Block a user