diff --git a/code/controllers/subsystems/processing/processing.dm b/code/controllers/subsystems/processing/processing.dm index c5d6dfa126..ef54b8a4ab 100644 --- a/code/controllers/subsystems/processing/processing.dm +++ b/code/controllers/subsystems/processing/processing.dm @@ -9,6 +9,10 @@ SUBSYSTEM_DEF(processing) 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 /datum/controller/subsystem/processing/stat_entry() ..("[stat_tag]:[processing.len]") @@ -30,6 +34,32 @@ SUBSYSTEM_DEF(processing) if (MC_TICK_CHECK) return +/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