From c520ebd8a50c40246fa7dabd71c419b55233aba6 Mon Sep 17 00:00:00 2001 From: Krausus Date: Sat, 18 Jul 2015 13:14:32 -0400 Subject: [PATCH] Process and Process Scheduler Tweaks --- code/_globalvars/lists/mobs.dm | 2 - .../ProcessScheduler/core/process.dm | 102 ++++++++++++------ .../ProcessScheduler/core/processScheduler.dm | 30 ++++-- code/controllers/Processes/air.dm | 27 ++++- code/controllers/Processes/bot.dm | 28 +++-- code/controllers/Processes/disease.dm | 11 -- .../controllers/Processes/emergencyShuttle.dm | 2 +- code/controllers/Processes/garbage.dm | 16 +-- code/controllers/Processes/lighting.dm | 15 +++ code/controllers/Processes/machinery.dm | 29 +++-- code/controllers/Processes/mob.dm | 29 +++-- code/controllers/Processes/nanoui.dm | 16 ++- code/controllers/Processes/obj.dm | 27 +++-- code/controllers/Processes/pipenet.dm | 13 ++- code/controllers/Processes/shuttle.dm | 2 +- code/controllers/Processes/supply.dm | 2 +- code/controllers/master_controller.dm | 4 +- code/game/machinery/doors/airlock_control.dm | 3 +- .../garbage collection/garbage_collector.dm | 11 +- code/modules/lighting/lighting_process.dm | 13 +-- code/modules/mob/mob.dm | 75 +------------ paradise.dme | 4 +- 22 files changed, 257 insertions(+), 204 deletions(-) delete mode 100644 code/controllers/Processes/disease.dm create mode 100644 code/controllers/Processes/lighting.dm diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 5de92892b30..41816d7d7d8 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -52,5 +52,3 @@ var/global/list/med_hud_users = list() var/global/list/sec_hud_users = list() var/global/list/antag_hud_users = list() //items that ask to be called every cycle - -var/global/list/active_diseases = list() //Diseases are mob-based, so they get to go here \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index 89048113d30..0cfec361b3f 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -85,7 +85,13 @@ var/tmp/last_object -datum/controller/process/New(var/datum/controller/processScheduler/scheduler) + // Counts the number of times an exception has occurred; gets reset after 10 + var/tmp/list/exceptions = list() + + // Number of deciseconds to delay before starting the process + var/start_delay = 0 + +/datum/controller/process/New(var/datum/controller/processScheduler/scheduler) ..() main = scheduler previousStatus = "idle" @@ -99,7 +105,7 @@ datum/controller/process/New(var/datum/controller/processScheduler/scheduler) last_task = 0 last_object = null -datum/controller/process/proc/started() +/datum/controller/process/proc/started() // Initialize last_slept so we can know when to sleep last_slept = world.timeofday @@ -114,48 +120,48 @@ datum/controller/process/proc/started() onStart() -datum/controller/process/proc/finished() +/datum/controller/process/proc/finished() ticks++ idle() main.processFinished(src) onFinish() -datum/controller/process/proc/doWork() +/datum/controller/process/proc/doWork() -datum/controller/process/proc/setup() +/datum/controller/process/proc/setup() -datum/controller/process/proc/process() +/datum/controller/process/proc/process() started() doWork() finished() -datum/controller/process/proc/running() +/datum/controller/process/proc/running() idle = 0 queued = 0 running = 1 hung = 0 setStatus(PROCESS_STATUS_RUNNING) -datum/controller/process/proc/idle() +/datum/controller/process/proc/idle() queued = 0 running = 0 idle = 1 hung = 0 setStatus(PROCESS_STATUS_IDLE) -datum/controller/process/proc/queued() +/datum/controller/process/proc/queued() idle = 0 running = 0 queued = 1 hung = 0 setStatus(PROCESS_STATUS_QUEUED) -datum/controller/process/proc/hung() +/datum/controller/process/proc/hung() hung = 1 setStatus(PROCESS_STATUS_HUNG) -datum/controller/process/proc/handleHung() +/datum/controller/process/proc/handleHung() var/datum/lastObj = last_object var/lastObjType = "null" if(istype(lastObj)) @@ -172,7 +178,7 @@ datum/controller/process/proc/handleHung() main.restartProcess(src.name) -datum/controller/process/proc/kill() +/datum/controller/process/proc/kill() if (!killed) var/msg = "[name] process was killed at tick #[ticks]." logTheThing("debug", null, null, msg) @@ -187,7 +193,7 @@ datum/controller/process/proc/kill() // This should del del(src) -datum/controller/process/proc/scheck(var/tickId = 0) +/datum/controller/process/proc/scheck(var/tickId = 0) if (killed) // The kill proc is the only place where killed is set. // The kill proc should have deleted this datum, and all sleeping procs that are @@ -196,8 +202,8 @@ datum/controller/process/proc/scheck(var/tickId = 0) // For each tick the process defers, it increments the cpu_defer_count so we don't // defer indefinitely - if (world.cpu >= cpu_threshold + cpu_defer_count * 10) - sleep(1) + if (world.cpu >= (cpu_threshold + cpu_defer_count * world.tick_lag * 10)) + sleep(world.tick_lag) cpu_defer_count++ last_slept = world.timeofday else @@ -210,7 +216,7 @@ datum/controller/process/proc/scheck(var/tickId = 0) sleep(0) last_slept = world.timeofday -datum/controller/process/proc/update() +/datum/controller/process/proc/update() // Clear delta if(previousStatus != status) setStatus(status) @@ -224,18 +230,18 @@ datum/controller/process/proc/update() else if (elapsedTime > hang_warning_time) setStatus(PROCESS_STATUS_MAYBE_HUNG) -datum/controller/process/proc/getElapsedTime() +/datum/controller/process/proc/getElapsedTime() if (world.timeofday < run_start) return world.timeofday - (run_start - 864000) return world.timeofday - run_start -datum/controller/process/proc/tickDetail() +/datum/controller/process/proc/tickDetail() return -datum/controller/process/proc/getContext() +/datum/controller/process/proc/getContext() return "[name][main.averageRunTime(src)][main.last_run_time[src]][main.highest_run_time[src]][ticks]\n" -datum/controller/process/proc/getContextData() +/datum/controller/process/proc/getContextData() return list( "name" = name, "averageRunTime" = main.averageRunTime(src), @@ -247,10 +253,10 @@ datum/controller/process/proc/getContextData() "disabled" = disabled ) -datum/controller/process/proc/getStatus() +/datum/controller/process/proc/getStatus() return status -datum/controller/process/proc/getStatusText(var/s = 0) +/datum/controller/process/proc/getStatusText(var/s = 0) if(!s) s = status switch(s) @@ -269,21 +275,21 @@ datum/controller/process/proc/getStatusText(var/s = 0) else return "UNKNOWN" -datum/controller/process/proc/getPreviousStatus() +/datum/controller/process/proc/getPreviousStatus() return previousStatus -datum/controller/process/proc/getPreviousStatusText() +/datum/controller/process/proc/getPreviousStatusText() return getStatusText(previousStatus) -datum/controller/process/proc/setStatus(var/newStatus) +/datum/controller/process/proc/setStatus(var/newStatus) previousStatus = status status = newStatus -datum/controller/process/proc/setLastTask(var/task, var/object) +/datum/controller/process/proc/setLastTask(var/task, var/object) last_task = task last_object = object -datum/controller/process/proc/_copyStateFrom(var/datum/controller/process/target) +/datum/controller/process/proc/_copyStateFrom(var/datum/controller/process/target) main = target.main name = target.name schedule_interval = target.schedule_interval @@ -296,22 +302,52 @@ datum/controller/process/proc/_copyStateFrom(var/datum/controller/process/target last_object = target.last_object copyStateFrom(target) -datum/controller/process/proc/copyStateFrom(var/datum/controller/process/target) +/datum/controller/process/proc/copyStateFrom(var/datum/controller/process/target) -datum/controller/process/proc/onKill() +/datum/controller/process/proc/onKill() -datum/controller/process/proc/onStart() +/datum/controller/process/proc/onStart() -datum/controller/process/proc/onFinish() +/datum/controller/process/proc/onFinish() -datum/controller/process/proc/disable() +/datum/controller/process/proc/disable() disabled = 1 -datum/controller/process/proc/enable() +/datum/controller/process/proc/enable() disabled = 0 /datum/controller/process/proc/getLastRunTime() return main.getProcessLastRunTime(src) +/datum/controller/process/proc/getHighestRunTime() + return main.getProcessHighestRunTime(src) + /datum/controller/process/proc/getTicks() return ticks + +/datum/controller/process/proc/statProcess() + stat("[name]", "T#[getTicks()]|LR [getLastRunTime()]|HR [getHighestRunTime()]|D [cpu_defer_count]") + +/datum/controller/process/proc/catchException(var/exception/e, var/thrower) + var/etext = "[e]" + var/eid = "[e]" // Exception ID, for tracking repeated exceptions + var/ptext = "" // "processing..." text, for what was being processed (if known) + if(istype(e)) + etext += " in [e.file], line [e.line]" + eid = "[e.file]:[e.line]" + if(eid in exceptions) + if(exceptions[eid]++ >= 10) + return + else + exceptions[eid] = 1 + if(istype(thrower, /datum)) + var/datum/D = thrower + ptext = " processing [D.type]" + if(istype(thrower, /atom)) + var/atom/A = thrower + ptext += " ([A]) ([A.x],[A.y],[A.z])" + world.log << "\[[time_stamp()]\] Process [name] caught exception[ptext]: [etext]" + if(exceptions[eid] >= 10) + world.log << "This exception will now be ignored for ten minutes." + spawn(6000) + exceptions[eid] = 0 diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm index 1be24045938..49455b45f9e 100644 --- a/code/controllers/ProcessScheduler/core/processScheduler.dm +++ b/code/controllers/ProcessScheduler/core/processScheduler.dm @@ -66,6 +66,7 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/start() isRunning = 1 + updateStartDelays() spawn(0) process() @@ -108,12 +109,8 @@ var/global/datum/controller/processScheduler/processScheduler if (p.disabled || p.running || p.queued || !p.idle) continue - // If world.timeofday has rolled over, then we need to adjust. - if (world.timeofday < last_start[p]) - last_start[p] -= 864000 - // If the process should be running by now, go ahead and queue it - if (world.timeofday > last_start[p] + p.schedule_interval) + if (world.time >= last_start[p] + p.schedule_interval) setQueuedProcessState(p) /datum/controller/processScheduler/proc/runQueuedProcesses() @@ -176,6 +173,10 @@ var/global/datum/controller/processScheduler/processScheduler nameToProcessMap[newProcess.name] = newProcess +/datum/controller/processScheduler/proc/updateStartDelays() + for(var/datum/controller/process/p in processes) + if(p.start_delay) + last_start[p] = world.time - p.start_delay /datum/controller/processScheduler/proc/runProcess(var/datum/controller/process/process) spawn(0) @@ -222,17 +223,13 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/recordStart(var/datum/controller/process/process, var/time = null) if (isnull(time)) - time = world.timeofday + time = world.time last_start[process] = time /datum/controller/processScheduler/proc/recordEnd(var/datum/controller/process/process, var/time = null) if (isnull(time)) - time = world.timeofday - - // If world.timeofday has rolled over, then we need to adjust. - if (time < last_start[process]) - last_start[process] -= 864000 + time = world.time var/lastRunTime = time - last_start[process] @@ -316,5 +313,16 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/getProcessLastRunTime(var/datum/controller/process/process) return last_run_time[process] +/datum/controller/processScheduler/proc/getProcessHighestRunTime(var/datum/controller/process/process) + return highest_run_time[process] + /datum/controller/processScheduler/proc/getIsRunning() return isRunning + +/datum/controller/processScheduler/proc/statProcesses() + if(!isRunning) + stat("Processes", "Scheduler not running") + return + stat("Processes", "[processes.len] (R[running.len]/Q[queued.len]/I[idle.len])") + for(var/datum/controller/process/p in processes) + p.statProcess() diff --git a/code/controllers/Processes/air.dm b/code/controllers/Processes/air.dm index c251b913ce6..00206b1fc39 100644 --- a/code/controllers/Processes/air.dm +++ b/code/controllers/Processes/air.dm @@ -15,9 +15,17 @@ var/global/datum/controller/process/air_system/air_master var/failed_ticks = 0 var/tick_progress = 0 + // Stats + var/last_active = 0 + var/last_excited = 0 + var/last_hpd = 0 + var/last_hotspots = 0 + var/last_asc = 0 + /datum/controller/process/air_system/setup() name = "air" schedule_interval = 20 // every 2 seconds + start_delay = 4 air_master = src world << "Processing Geometry..." @@ -32,30 +40,41 @@ var/global/datum/controller/process/air_system/air_master current_cycle++ process_active_turfs() process_excited_groups() - scheck() process_high_pressure_delta() process_hotspots() process_super_conductivity() - scheck() return 1 +/datum/controller/process/air_system/statProcess() + ..() + stat(null, "[last_active] active") + stat(null, "[last_excited] EG|[last_hpd] HPD|[last_asc] ASC|[last_hotspots] Hot") + /datum/controller/process/air_system/proc/process_hotspots() + last_hotspots = hotspots.len for(var/obj/effect/hotspot/H in hotspots) H.process() + scheck() /datum/controller/process/air_system/proc/process_super_conductivity() + last_asc = active_super_conductivity.len for(var/turf/simulated/T in active_super_conductivity) T.super_conduct() + scheck() /datum/controller/process/air_system/proc/process_high_pressure_delta() + last_hpd = high_pressure_delta.len for(var/turf/T in high_pressure_delta) T.high_pressure_movements() T.pressure_difference = 0 - high_pressure_delta.len = 0 + scheck() + high_pressure_delta.Cut() /datum/controller/process/air_system/proc/process_active_turfs() + last_active = active_turfs.len for(var/turf/simulated/T in active_turfs) T.process_cell() + scheck() /datum/controller/process/air_system/proc/remove_from_active(var/turf/simulated/T) if(istype(T)) @@ -100,6 +119,7 @@ var/global/datum/controller/process/air_system/air_master active_turfs |= T /datum/controller/process/air_system/proc/process_excited_groups() + last_excited = excited_groups.len for(var/datum/excited_group/EG in excited_groups) EG.breakdown_cooldown ++ if(EG.breakdown_cooldown == 10) @@ -107,6 +127,7 @@ var/global/datum/controller/process/air_system/air_master return if(EG.breakdown_cooldown > 20) EG.dismantle() + scheck() /datum/controller/process/air_system/proc/setup_overlays() plmaster = new /obj/effect/overlay() diff --git a/code/controllers/Processes/bot.dm b/code/controllers/Processes/bot.dm index b93324d0901..618c5ae90b8 100644 --- a/code/controllers/Processes/bot.dm +++ b/code/controllers/Processes/bot.dm @@ -1,20 +1,28 @@ /datum/controller/process/bot - var/tmp/datum/updateQueue/updateQueueInstance /datum/controller/process/bot/setup() name = "bot" schedule_interval = 20 // every 2 seconds - updateQueueInstance = new /datum/controller/process/bot/started() ..() - if(!updateQueueInstance) - if(!aibots) - aibots = list() - else if(aibots.len) - updateQueueInstance = new + if(!aibots) + aibots = list() + +/datum/controller/process/bot/statProcess() + ..() + stat(null, "[aibots && aibots.len] bots") /datum/controller/process/bot/doWork() - if(updateQueueInstance) - updateQueueInstance.init(aibots, "bot_process") - updateQueueInstance.Run() + for(var/obj/machinery/bot/B in aibots) + if(istype(B) && isnull(B.gcDestroyed)) + // Some bots sleep when they process, but there's not many bots, so just spawn them off + spawn(-1) + try + B.bot_process() + catch(var/exception/e) + catchException(e, B) + // Use src explicitly after a try/catch, or BYOND messes src up. I have no idea why. + src.scheck() + else + aibots -= B \ No newline at end of file diff --git a/code/controllers/Processes/disease.dm b/code/controllers/Processes/disease.dm deleted file mode 100644 index a8d840097ec..00000000000 --- a/code/controllers/Processes/disease.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/controller/process/disease - var/tmp/datum/updateQueue/updateQueueInstance - -/datum/controller/process/disease/setup() - name = "disease" - schedule_interval = 20 // every 2 seconds - updateQueueInstance = new - -/datum/controller/process/disease/doWork() - updateQueueInstance.init(active_diseases, "process") - updateQueueInstance.Run() diff --git a/code/controllers/Processes/emergencyShuttle.dm b/code/controllers/Processes/emergencyShuttle.dm index e7289311b95..efd537bb062 100644 --- a/code/controllers/Processes/emergencyShuttle.dm +++ b/code/controllers/Processes/emergencyShuttle.dm @@ -1,5 +1,5 @@ /datum/controller/process/emergencyShuttle/setup() - name = "emergency shuttle" + name = "e-shuttle" schedule_interval = 20 // every 2 seconds if(!emergency_shuttle) diff --git a/code/controllers/Processes/garbage.dm b/code/controllers/Processes/garbage.dm index f589c641f5b..68a01747513 100644 --- a/code/controllers/Processes/garbage.dm +++ b/code/controllers/Processes/garbage.dm @@ -1,10 +1,14 @@ -/datum/controller/process/garbage/setup() +/datum/controller/process/garbage_collector/setup() name = "garbage" schedule_interval = 20 // every 2 seconds - if(!garbageCollector) - garbageCollector = new + garbageCollector = src -/datum/controller/process/garbage/doWork() - garbageCollector.process() - scheck() \ No newline at end of file +/datum/controller/process/garbage_collector/doWork() + // Garbage collection code can be found in code\modules\garbage collection\garbage_collector.dm + processGarbage() + +/datum/controller/process/garbage_collector/statProcess() + ..() + stat(null, "[del_everything ? "Off" : "On"], [queue.len] queued") + stat(null, "Dels: [dels_count], [soft_dels] soft, [hard_dels] hard") diff --git a/code/controllers/Processes/lighting.dm b/code/controllers/Processes/lighting.dm new file mode 100644 index 00000000000..dd0a1e928f6 --- /dev/null +++ b/code/controllers/Processes/lighting.dm @@ -0,0 +1,15 @@ +var/global/datum/controller/process/lighting/lighting_controller + +/datum/controller/process/lighting/setup() + name = "lighting" + schedule_interval = LIGHTING_INTERVAL + start_delay = 1 + lighting_controller = src + + create_lighting_overlays() + +/datum/controller/process/lighting/statProcess() + ..() + stat(null, "[last_light_count] lights, [last_overlay_count] overlays") + +// Lighting process code located in modules\lighting\lighting_process.dm \ No newline at end of file diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index 2d8986ff2ae..39e5bb80195 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -1,6 +1,12 @@ /datum/controller/process/machinery/setup() name = "machinery" schedule_interval = 20 // every 2 seconds + start_delay = 12 + +/datum/controller/process/machinery/statProcess() + ..() + stat(null, "[machines.len] machines") + stat(null, "[powernets.len] powernets") /datum/controller/process/machinery/doWork() process_power() @@ -13,13 +19,16 @@ var/time_start = world.timeofday #endif - if(M.process() == PROCESS_KILL) - //M.inMachineList = 0 We don't use this debugging function - machines.Remove(M) - continue + try + if(M.process() == PROCESS_KILL) + //M.inMachineList = 0 We don't use this debugging function + machines.Remove(M) + continue - if(M && M.use_power) - M.auto_use_power() + if(M && M.use_power) + M.auto_use_power() + catch(var/exception/e) + catchException(e, M) #ifdef PROFILE_MACHINES var/time_end = world.timeofday @@ -37,8 +46,12 @@ /datum/controller/process/machinery/proc/process_power() for(var/datum/powernet/powerNetwork in powernets) if(istype(powerNetwork) && isnull(powerNetwork.gcDestroyed)) - powerNetwork.reset() - scheck() + try + powerNetwork.reset() + catch(var/exception/e) + catchException(e, powerNetwork) + // Use src explicitly after a try/catch, or BYOND messes src up. I have no idea why. + src.scheck() continue else powernets -= powerNetwork diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm index 4be567c4ef2..ea2beb24dd4 100644 --- a/code/controllers/Processes/mob.dm +++ b/code/controllers/Processes/mob.dm @@ -1,27 +1,34 @@ /datum/controller/process/mob - var/tmp/datum/updateQueue/updateQueueInstance /datum/controller/process/mob/setup() name = "mob" schedule_interval = 20 // every 2 seconds - updateQueueInstance = new + start_delay = 16 if(!mob_master) mob_master = new mob_master.Setup() /datum/controller/process/mob/started() ..() - if(!updateQueueInstance) - if(!mob_list) - mob_list = list() - else if(mob_list.len) - updateQueueInstance = new + if(!mob_list) + mob_list = list() + +/datum/controller/process/mob/statProcess() + ..() + stat(null, "[mob_list.len] mobs") /datum/controller/process/mob/doWork() - if(updateQueueInstance) - updateQueueInstance.init(mob_list, "Life") - updateQueueInstance.Run() - mob_master.process() + for(var/mob/M in mob_list) + if(istype(M) && isnull(M.gcDestroyed)) + try + M.Life() + catch(var/exception/e) + catchException(e, M) + // Use src explicitly after a try/catch, or BYOND messes src up. I have no idea why. + src.scheck() + else + mob_list -= M + mob_master.process() var/global/datum/controller/mob_system/mob_master diff --git a/code/controllers/Processes/nanoui.dm b/code/controllers/Processes/nanoui.dm index c8396bcab87..83b4b21aa89 100644 --- a/code/controllers/Processes/nanoui.dm +++ b/code/controllers/Processes/nanoui.dm @@ -1,11 +1,19 @@ /datum/controller/process/nanoui - var/tmp/datum/updateQueue/updateQueueInstance /datum/controller/process/nanoui/setup() name = "nanoui" schedule_interval = 20 // every 2 seconds - updateQueueInstance = new + +/datum/controller/process/nanoui/statProcess() + ..() + stat(null, "[nanomanager.processing_uis.len] UIs") /datum/controller/process/nanoui/doWork() - updateQueueInstance.init(nanomanager.processing_uis, "process") - updateQueueInstance.Run() + for(var/datum/nanoui/NUI in nanomanager.processing_uis) + if(istype(NUI) && isnull(NUI.gcDestroyed)) + try + NUI.process() + catch(var/exception/e) + catchException(e, NUI) + else + nanomanager.processing_uis -= NUI diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm index 15ad98dd3d6..1559fc52b32 100644 --- a/code/controllers/Processes/obj.dm +++ b/code/controllers/Processes/obj.dm @@ -1,21 +1,28 @@ var/global/list/object_profiling = list() /datum/controller/process/obj - var/tmp/datum/updateQueue/updateQueueInstance /datum/controller/process/obj/setup() name = "obj" schedule_interval = 20 // every 2 seconds - updateQueueInstance = new + start_delay = 8 /datum/controller/process/obj/started() ..() - if(!updateQueueInstance) - if(!processing_objects) - processing_objects = list() - else if(processing_objects.len) - updateQueueInstance = new + if(!processing_objects) + processing_objects = list() + +/datum/controller/process/obj/statProcess() + ..() + stat(null, "[processing_objects.len] objects") /datum/controller/process/obj/doWork() - if(updateQueueInstance) - updateQueueInstance.init(processing_objects, "process") - updateQueueInstance.Run() + for(var/obj/O in processing_objects) + if(istype(O) && isnull(O.gcDestroyed)) + try + O.process() + catch(var/exception/e) + catchException(e, O) + // Use src explicitly after a try/catch, or BYOND messes src up. I have no idea why. + src.scheck() + else + processing_objects -= O \ No newline at end of file diff --git a/code/controllers/Processes/pipenet.dm b/code/controllers/Processes/pipenet.dm index b59373a88a1..f76a8eeec4a 100644 --- a/code/controllers/Processes/pipenet.dm +++ b/code/controllers/Processes/pipenet.dm @@ -1,12 +1,21 @@ /datum/controller/process/pipenet/setup() name = "pipenet" schedule_interval = 20 // every 2 seconds + start_delay = 18 + +/datum/controller/process/pipenet/statProcess() + ..() + stat(null, "[pipe_networks.len] pipe nets") /datum/controller/process/pipenet/doWork() for(var/datum/pipe_network/pipeNetwork in pipe_networks) if(istype(pipeNetwork) && isnull(pipeNetwork.gcDestroyed)) - pipeNetwork.process() - scheck() + try + pipeNetwork.process() + catch(var/exception/e) + catchException(e, pipeNetwork) + // Use src explicitly after a try/catch, or BYOND messes src up. I have no idea why. + src.scheck() continue else pipe_networks -= pipeNetwork diff --git a/code/controllers/Processes/shuttle.dm b/code/controllers/Processes/shuttle.dm index a10586d76d9..df0e5fa1ae2 100644 --- a/code/controllers/Processes/shuttle.dm +++ b/code/controllers/Processes/shuttle.dm @@ -1,5 +1,5 @@ /datum/controller/process/Shuttle/setup() - name = "shuttle controller" + name = "shuttle" schedule_interval = 20 // every 2 seconds if(!shuttle_controller) diff --git a/code/controllers/Processes/supply.dm b/code/controllers/Processes/supply.dm index 891a511ec6d..aa4ba1e52ab 100644 --- a/code/controllers/Processes/supply.dm +++ b/code/controllers/Processes/supply.dm @@ -1,5 +1,5 @@ /datum/controller/process/supply/setup() - name = "supply controller" + name = "supply" schedule_interval = 300 // every 30 seconds /datum/controller/process/supply/doWork() diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 99d8931ef3a..533725d51cb 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -42,8 +42,6 @@ datum/controller/game_controller var/list/shuttle_list // For debugging and VV var/datum/ore_distribution/asteroid_ore_map // For debugging and VV. - var/global/datum/garbage_collector/garbageCollector - datum/controller/game_controller/New() //There can be only one master_controller. Out with the old and in with the new. if(master_controller != src) @@ -255,7 +253,7 @@ datum/controller/game_controller/proc/process() // GC timer = world.timeofday last_thing_processed = garbageCollector.type - garbageCollector.process() + garbageCollector.processGarbage() garbageCollectorCost = (world.timeofday - timer) / 10 //TIMING diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index fef0ef7d66b..dda0a74abe0 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -11,7 +11,8 @@ obj/machinery/door/airlock obj/machinery/door/airlock/process() ..() if (arePowerSystemsOn()) - execute_current_command() + spawn() + execute_current_command() obj/machinery/door/airlock/receive_signal(datum/signal/signal) if (!arePowerSystemsOn()) return //no power diff --git a/code/modules/garbage collection/garbage_collector.dm b/code/modules/garbage collection/garbage_collector.dm index 97d67c30ac8..3e6c6c0b967 100644 --- a/code/modules/garbage collection/garbage_collector.dm +++ b/code/modules/garbage collection/garbage_collector.dm @@ -9,14 +9,14 @@ // A list of types that were queued in the GC, and had to be soft deleted; used in testing var/list/gc_hard_del_types = list() -var/datum/garbage_collector/garbageCollector +var/global/datum/controller/process/garbage_collector/garbageCollector // The time a datum was destroyed by the GC, or null if it hasn't been /datum/var/gcDestroyed // Whether a datum was hard-deleted by the GC; 0 if not, 1 if it was queued, -1 if directly deleted /datum/var/hard_deleted = 0 -/datum/garbage_collector +/datum/controller/process/garbage_collector var/list/queue = new var/del_everything = 0 @@ -25,7 +25,7 @@ var/datum/garbage_collector/garbageCollector var/hard_dels = 0 var/soft_dels = 0 -/datum/garbage_collector/proc/addTrash(var/datum/D) +/datum/controller/process/garbage_collector/proc/addTrash(var/datum/D) if(!istype(D) || del_everything) del(D) hard_dels++ @@ -35,7 +35,7 @@ var/datum/garbage_collector/garbageCollector queue -= "\ref[D]" // If this is a re-used ref, remove the old ref from the queue queue["\ref[D]"] = world.time -/datum/garbage_collector/proc/process() +/datum/controller/process/garbage_collector/proc/processGarbage() var/remainingCollectionPerTick = GC_COLLECTIONS_PER_TICK var/remainingForceDelPerTick = GC_FORCE_DEL_PER_TICK var/collectionTimeScope = world.time - GC_COLLECTION_TIMEOUT @@ -64,6 +64,7 @@ var/datum/garbage_collector/garbageCollector queue.Cut(1, 2) soft_dels++ dels_count++ + scheck() #ifdef GC_DEBUG #undef GC_DEBUG @@ -73,7 +74,7 @@ var/datum/garbage_collector/garbageCollector #undef GC_COLLECTION_TIMEOUT #undef GC_COLLECTIONS_PER_TICK -/datum/garbage_collector/proc/hardDel(var/datum/D) +/datum/controller/process/garbage_collector/proc/hardDel(var/datum/D) gc_hard_del_types |= D.type D.hard_deleted = 1 if(!D.gcDestroyed) diff --git a/code/modules/lighting/lighting_process.dm b/code/modules/lighting/lighting_process.dm index a0242f78b69..2ea0d0133c0 100644 --- a/code/modules/lighting/lighting_process.dm +++ b/code/modules/lighting/lighting_process.dm @@ -1,14 +1,10 @@ -var/global/datum/controller/process/lighting/lighting_controller - -/datum/controller/process/lighting/setup() - name = "lighting" - schedule_interval = LIGHTING_INTERVAL - lighting_controller = src - - create_lighting_overlays() +/datum/controller/process/lighting + var/last_light_count = 0 + var/last_overlay_count = 0 /datum/controller/process/lighting/doWork() var/list/lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from scheck() don't cause things to be cut from the list without being updated. + last_light_count = lighting_update_lights.len lighting_update_lights = list() for(var/datum/light_source/L in lighting_update_lights_old) @@ -22,6 +18,7 @@ var/global/datum/controller/process/lighting/lighting_controller scheck() var/list/lighting_update_overlays_old = lighting_update_overlays //Same as above. + last_overlay_count = lighting_update_overlays.len lighting_update_overlays = list() for(var/atom/movable/lighting_overlay/O in lighting_update_overlays_old) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 5042ae90996..f89f19066c8 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -926,77 +926,12 @@ var/list/slot_equipment_priority = list( \ if(client && client.holder) if(statpanel("DI")) //not looking at that panel - stat(null, "Location:\t([x], [y], [z])") - stat(null, "CPU:\t[world.cpu]") - stat(null, "Instances:\t[world.contents.len]") + stat("Loc", "([x], [y], [z]) [loc]") + stat("CPU", "[world.cpu]") + stat("Instances", "[world.contents.len]") - if (garbageCollector) - stat(null, "\tqdel - [garbageCollector.del_everything ? "off" : "on"]") - stat(null, "\ton queue - [garbageCollector.queue.len]") - stat(null, "\ttotal delete - [garbageCollector.dels_count]") - stat(null, "\tsoft delete - [garbageCollector.soft_dels]") - stat(null, "\thard delete - [garbageCollector.hard_dels]") - else - stat(null, "Garbage Controller is not running.") - - if(processScheduler.getIsRunning()) - var/datum/controller/process/process - - process = processScheduler.getProcess("ticker") - stat(null, "TIC\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("air") - stat(null, "AIR\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("lighting") - stat(null, "LIG\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("mob") - stat(null, "MOB([mob_list.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("machinery") - stat(null, "MAC([machines.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("obj") - stat(null, "OBJ([processing_objects.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("bot") - stat(null, "BOT([aibots.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("pipenet") - stat(null, "PIP([pipe_networks.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("nanoui") - stat(null, "NAN([nanomanager.processing_uis.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("disease") - stat(null, "DIS([active_diseases.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("garbage") - stat(null, "GAR\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("sun") - stat(null, "SUN([sun.solars.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - //process = processScheduler.getProcess("garbage") - //stat(null, "GAR\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - //process = processScheduler.getProcess("vote") - //stat(null, "VOT\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - //process = processScheduler.getProcess("shuttle controller") - //stat(null, "SHT\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - //process = processScheduler.getProcess("emergency shuttle") - //stat(null, "EME\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - //process = processScheduler.getProcess("inactivity") - //stat(null, "IAC\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - //process = processScheduler.getProcess("event") - //stat(null, "EVE([events.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - else - stat(null, "processScheduler is not running.") + if(processScheduler) + processScheduler.statProcesses() statpanel("Status") // Switch to the Status panel again, for the sake of the lazy Stat procs diff --git a/paradise.dme b/paradise.dme index 9b0a59df6e8..c51d10cf80b 100644 --- a/paradise.dme +++ b/paradise.dme @@ -147,11 +147,11 @@ #include "code\controllers\voting.dm" #include "code\controllers\Processes\air.dm" #include "code\controllers\Processes\bot.dm" -#include "code\controllers\Processes\disease.dm" #include "code\controllers\Processes\emergencyShuttle.dm" #include "code\controllers\Processes\event.dm" #include "code\controllers\Processes\garbage.dm" #include "code\controllers\Processes\inactivity.dm" +#include "code\controllers\Processes\lighting.dm" #include "code\controllers\Processes\machinery.dm" #include "code\controllers\Processes\mob.dm" #include "code\controllers\Processes\nanoui.dm" @@ -166,8 +166,6 @@ #include "code\controllers\ProcessScheduler\core\_stubs.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" -#include "code\controllers\ProcessScheduler\core\updateQueue.dm" -#include "code\controllers\ProcessScheduler\core\updateQueueWorker.dm" #include "code\datums\ai_laws.dm" #include "code\datums\browser.dm" #include "code\datums\cargoprofile.dm"