mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 07:32:02 +00:00
changes: Rewrote scheduler to use a sorted linked-list to store scheduled tasks so that only one element needs to be checked if none of the tasks are ready to fire. Scheduler now checks tasks every 2 ds. Adding tasks to an empty scheduler or tasks that are triggered after any existing tasks is fast, but adding tasks that trigger between two existing tasks requires iterating through some of the task list. It's no addtimer(), but it's something.
80 lines
2.3 KiB
Plaintext
80 lines
2.3 KiB
Plaintext
/*************
|
|
* Task Datum *
|
|
*************/
|
|
/datum/scheduled_task
|
|
var/trigger_time
|
|
var/procedure
|
|
var/list/arguments
|
|
var/task_after_process
|
|
var/list/task_after_process_args
|
|
var/datum/scheduled_task/next
|
|
var/destroyed = FALSE
|
|
|
|
/datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
|
|
..()
|
|
src.trigger_time = trigger_time
|
|
src.procedure = procedure
|
|
src.arguments = arguments ? arguments : list()
|
|
src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task
|
|
src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list()
|
|
task_after_process_args += src
|
|
|
|
/datum/scheduled_task/Destroy()
|
|
if (!destroyed)
|
|
kill(no_del = TRUE)
|
|
procedure = null
|
|
arguments.Cut()
|
|
task_after_process = null
|
|
task_after_process_args.Cut()
|
|
return ..()
|
|
|
|
/datum/scheduled_task/proc/pre_process()
|
|
return
|
|
|
|
/datum/scheduled_task/proc/process()
|
|
if(procedure)
|
|
call(procedure)(arglist(arguments))
|
|
|
|
/datum/scheduled_task/proc/post_process()
|
|
call(task_after_process)(arglist(task_after_process_args))
|
|
|
|
// Resets the trigger time, has no effect if the task has already triggered
|
|
/datum/scheduled_task/proc/trigger_task_in(var/trigger_in)
|
|
src.trigger_time = world.time + trigger_in
|
|
|
|
/datum/scheduled_task/proc/kill(no_del = FALSE)
|
|
if (!destroyed)
|
|
warning("scheduler: Non-destroyed task was killed!")
|
|
destroyed = TRUE
|
|
|
|
if (src in scheduler.tasks)
|
|
warning("scheduler: Task was not cleaned up correctly, rebuilding scheduler queue!")
|
|
scheduler.rebuild_queue()
|
|
|
|
if (!no_del)
|
|
qdel(src)
|
|
|
|
/datum/scheduled_task/source
|
|
var/datum/source
|
|
|
|
/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
|
|
..(trigger_time, procedure, arguments, task_after_process, task_after_process_args)
|
|
|
|
/datum/scheduled_task/source/Destroy()
|
|
source = null
|
|
return ..()
|
|
|
|
/datum/scheduled_task/source/process()
|
|
call(source, procedure)(arglist(arguments))
|
|
|
|
/datum/scheduled_task/source/proc/source_destroyed()
|
|
destroyed = TRUE
|
|
|
|
/proc/destroy_scheduled_task(var/datum/scheduled_task/st)
|
|
st.destroyed = TRUE
|
|
|
|
/proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st)
|
|
st.trigger_time = world.time + trigger_delay
|
|
scheduler.schedule(st)
|