Turns events into vars instead of a list, to greatly simplify qdel() cleanup.

This commit is contained in:
PsiOmegaDelta
2015-12-14 13:44:05 +01:00
parent 3996c2a57a
commit 7d7aa4b50b
8 changed files with 69 additions and 57 deletions
+4 -7
View File
@@ -28,16 +28,13 @@
stat(null, "[scheduled_tasks.len] task\s")
/datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st)
if(world.time < st.trigger_time)
scheduled_tasks += st
st.register(OBSERVER_EVENT_DESTROY, src, /datum/controller/process/scheduler/proc/unschedule)
else
st.process()
scheduled_tasks += st
st.destruction.register(src, /datum/controller/process/scheduler/proc/unschedule)
/datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st)
if(st in scheduled_tasks)
scheduled_tasks -= st
st.unregister(OBSERVER_EVENT_DESTROY, src)
st.destruction.unregister(src)
/**********
* Helpers *
@@ -98,7 +95,7 @@
/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
src.source = source
src.source.register(OBSERVER_EVENT_DESTROY, src, /datum/scheduled_task/source/proc/source_destroyed)
src.source.destruction.register(src, /datum/scheduled_task/source/proc/source_destroyed)
..(trigger_time, procedure, arguments, task_after_process, task_after_process_args)
/datum/scheduled_task/source/Destroy()
@@ -1,41 +0,0 @@
#define OBSERVER_EVENT_DESTROY "OnDestroy"
/datum
var/list/observer_events
/datum/Destroy()
raise_event(OBSERVER_EVENT_DESTROY, list(src))
for(var/list/listeners in observer_events)
listeners.Cut()
return ..()
/datum/proc/register(var/event, var/procOwner, var/proc_call)
var/list/listeners = get_listener_list_from_event(event, TRUE)
listeners[procOwner] = proc_call
/datum/proc/unregister(var/event, var/procOwner)
var/list/listeners = get_listener_list_from_event(event, FALSE)
listeners -= procOwner
/datum/proc/raise_event(var/event, var/list/args = list())
var/list/listeners = get_listener_list_from_event(event, FALSE)
if(listeners)
for(var/listener in listeners)
call(listener, listeners[listener])(arglist(args))
/datum/proc/get_listener_list_from_event(var/observer_event, var/create_list)
if(!observer_events)
if(create_list)
observer_events = list()
else
return
var/list/listeners = observer_events[observer_event]
if(!listeners)
if(create_list)
listeners = list()
observer_events[observer_event] = listeners
else
return
return listeners