From 53b111f4ae7932aac25c5a053a604357e23b6897 Mon Sep 17 00:00:00 2001 From: Greg Taylor Date: Wed, 23 May 2007 19:00:37 +0000 Subject: [PATCH] Shiny new event system that uses Twisted's task stuff. This one is a good bit more flexible and semantically correct. More to come on this soon. --- events.py | 10 +------ scheduler.py | 74 +++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 63 insertions(+), 21 deletions(-) diff --git a/events.py b/events.py index c83cd29a87..c6bcd4d16e 100644 --- a/events.py +++ b/events.py @@ -6,16 +6,8 @@ import session_mgr Holds the events scheduled in scheduler.py. """ -# Dictionary of events with a list in the form of: [, ] -schedule = { - 'check_sessions': [60, None] - } - - def check_sessions(): """ Event: Check all of the connected sessions. """ - session_mgr.check_all_sessions() - schedule['check_sessions'][1] = time.time() - reactor.callLater(schedule['check_sessions'][0], check_sessions) + session_mgr.check_all_sessions() \ No newline at end of file diff --git a/scheduler.py b/scheduler.py index c8db5d1804..fb0f9de9fe 100644 --- a/scheduler.py +++ b/scheduler.py @@ -1,22 +1,72 @@ import events -from twisted.internet import protocol, reactor, defer +from twisted.internet import task """ -A really simple scheduler. We can probably get a lot fancier with this -in the future, but it'll do for now. - ADDING AN EVENT: -* Add an entry to the 'schedule' dictionary in the 'events' file. -* Add the proper event_ function here. +* Create an event function to call. +* Add an entry to the 'schedule' dictionary here. * Profit. """ - -# The timer method to be triggered by the main server loop. + +# Dictionary of events with a list in the form of: +# [, , , , ] +schedule = { + 'check_sessions': [events.check_sessions, 5, None, None, "Session check."] +} + def start_events(): """ - Handle one tic/heartbeat. + Start the event system, which is built on Twisted's framework. """ - for event in events.schedule: - event_func = getattr(events, event) + for event in schedule: + event_func = get_event_function(event) if callable(event_func): - reactor.callLater(events.schedule[event][0], event_func) + # Set the call-back function for the task to trigger_event, but pass + # a reference to the event function. + event_task = task.LoopingCall(trigger_event, event_func, event) + # Start the task up with the specified interval. + event_task.start(get_event_interval(event), now=False) + # Set a reference to the event's task object in the dictionary so we + # can re-schedule, start, and stop events from elsewhere. + set_event_taskobj(event, event_task) + +def get_event(event_name): + """ + Return the relevant entry in the schedule dictionary for the named event. + + event_name: (string) The key of the event in the schedule dictionary. + """ + return schedule.get(event_name, None) + +def get_event_function(event_name): + """ + Return a reference to the event's function. + + event_name: (string) The key of the event in the schedule dictionary. + """ + return get_event(event_name)[0] + +def get_event_interval(event_name): + """ + Return the event's execution interval. + + event_name: (string) The key of the event in the schedule dictionary. + """ + return get_event(event_name)[1] + +def set_event_taskobj(event_name, taskobj): + """ + Sets an event's task object. + + event_name: (string) The key of the event in the schedule dictionary. + """ + get_event(event_name)[3] = taskobj + +def trigger_event(event_func, event_name): + """ + Update the last ran time and fire off the event. + + event_func: (func_reference) Reference to the event function to fire. + eventname: (string) The name of the event (as per schedule dict). + """ + event_func() \ No newline at end of file