mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
79 lines
2.8 KiB
Plaintext
79 lines
2.8 KiB
Plaintext
//Used to process objects. Fires once every second.
|
|
|
|
SUBSYSTEM_DEF(processing)
|
|
name = "Processing"
|
|
priority = FIRE_PRIORITY_PROCESS
|
|
flags = SS_BACKGROUND|SS_POST_FIRE_TIMING|SS_NO_INIT
|
|
wait = 10
|
|
|
|
var/stat_tag = "P" //Used for logging
|
|
var/list/processing = list()
|
|
var/list/currentrun = list()
|
|
var/process_proc = /datum/proc/process
|
|
|
|
var/debug_last_thing
|
|
var/debug_original_process_proc // initial() does not work with procs
|
|
var/datum/current_thing
|
|
|
|
/datum/controller/subsystem/processing/Recover()
|
|
log_debug("[name] subsystem Recover().")
|
|
if(SSprocessing.current_thing)
|
|
log_debug("current_thing was: (\ref[SSprocessing.current_thing])[SSprocessing.current_thing]([SSprocessing.current_thing.type]) - currentrun: [SSprocessing.currentrun.len] vs total: [SSprocessing.processing.len]")
|
|
var/list/old_processing = SSprocessing.processing.Copy()
|
|
for(var/datum/D in old_processing)
|
|
if(CHECK_BITFIELD(D.datum_flags, DF_ISPROCESSING))
|
|
processing |= D
|
|
|
|
/datum/controller/subsystem/processing/stat_entry()
|
|
..("[stat_tag]:[processing.len]")
|
|
|
|
/datum/controller/subsystem/processing/fire(resumed = 0)
|
|
if (!resumed)
|
|
currentrun = processing.Copy()
|
|
//cache for sanic speed (lists are references anyways)
|
|
var/list/current_run = currentrun
|
|
|
|
while(current_run.len)
|
|
current_thing = current_run[current_run.len]
|
|
current_run.len--
|
|
if(QDELETED(current_thing))
|
|
processing -= current_thing
|
|
else if(current_thing.process(wait) == PROCESS_KILL)
|
|
// fully stop so that a future START_PROCESSING will work
|
|
STOP_PROCESSING(src, current_thing)
|
|
if (MC_TICK_CHECK)
|
|
current_thing = null
|
|
return
|
|
|
|
current_thing = null
|
|
|
|
/datum/controller/subsystem/processing/proc/toggle_debug()
|
|
if(!check_rights(R_DEBUG))
|
|
return
|
|
|
|
if(debug_original_process_proc)
|
|
process_proc = debug_original_process_proc
|
|
debug_original_process_proc = null
|
|
else
|
|
debug_original_process_proc = process_proc
|
|
process_proc = /datum/proc/DebugSubsystemProcess
|
|
|
|
to_chat(usr, "[name] - Debug mode [debug_original_process_proc ? "en" : "dis"]abled")
|
|
|
|
/datum/proc/DebugSubsystemProcess(var/wait, var/times_fired, var/datum/controller/subsystem/processing/subsystem)
|
|
subsystem.debug_last_thing = src
|
|
var/start_tick = world.time
|
|
var/start_tick_usage = world.tick_usage
|
|
. = call(src, subsystem.debug_original_process_proc)(wait, times_fired)
|
|
|
|
var/tick_time = world.time - start_tick
|
|
var/tick_use_limit = world.tick_usage - start_tick_usage - 100 // Current tick use - starting tick use - 100% (a full tick excess)
|
|
if(tick_time > 0)
|
|
crash_with("[log_info_line(subsystem.debug_last_thing)] slept during processing. Spent [tick_time] tick\s.")
|
|
if(tick_use_limit > 0)
|
|
crash_with("[log_info_line(subsystem.debug_last_thing)] took longer than a tick to process. Exceeded with [tick_use_limit]%")
|
|
|
|
/datum/proc/process()
|
|
set waitfor = 0
|
|
return PROCESS_KILL
|