diff --git a/code/__defines/MC.dm b/code/__defines/MC.dm index 90724a2f98..08b8d223ec 100644 --- a/code/__defines/MC.dm +++ b/code/__defines/MC.dm @@ -51,3 +51,11 @@ #define SS_PAUSED 3 //paused by mc_tick_check #define SS_SLEEPING 4 //fire() slept. #define SS_PAUSING 5 //in the middle of pausing + +// Standard way to define a global subsystem, keep boilerplate organized here! +#define SUBSYSTEM_DEF(X) var/datum/controller/subsystem/##X/SS##X;\ +/datum/controller/subsystem/##X/New(){\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ +}\ +/datum/controller/subsystem/##X diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index ce9558ca4f..ff81fdc23e 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -27,8 +27,15 @@ var/datum/controller/subsystem/queue_next var/datum/controller/subsystem/queue_prev -// Used to initialize the subsystem BEFORE the map has loaded +//Do not override /datum/controller/subsystem/New() + return + +// Used to initialize the subsystem BEFORE the map has loaded +// Called AFTER Recover if that is called +// Prefer to use Initialize if possible +/datum/controller/subsystem/proc/PreInit() + return //This is used so the mc knows when the subsystem sleeps. do not override. /datum/controller/subsystem/proc/ignite(resumed = 0) diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index e849b64be6..117786c40c 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -1,6 +1,7 @@ -var/datum/controller/subsystem/garbage_collector/SSgarbage - -/datum/controller/subsystem/garbage_collector +// +// Garbage Collector Subsystem - Implements qdel() and the GC queue +// +SUBSYSTEM_DEF(garbage) name = "Garbage" priority = 15 wait = 5 @@ -34,10 +35,7 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage var/list/qdel_list = list() // list of all types that have been qdel()eted #endif -/datum/controller/subsystem/garbage_collector/New() - NEW_SS_GLOBAL(SSgarbage) - -/datum/controller/subsystem/garbage_collector/stat_entry(msg) +/datum/controller/subsystem/garbage/stat_entry(msg) msg += "Q:[queue.len]|D:[delslasttick]|G:[gcedlasttick]|" msg += "GR:" if (!(delslasttick+gcedlasttick)) @@ -52,14 +50,14 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%" ..(msg) -/datum/controller/subsystem/garbage_collector/fire() +/datum/controller/subsystem/garbage/fire() HandleToBeQueued() if(state == SS_RUNNING) HandleQueue() //If you see this proc high on the profile, what you are really seeing is the garbage collection/soft delete overhead in byond. //Don't attempt to optimize, not worth the effort. -/datum/controller/subsystem/garbage_collector/proc/HandleToBeQueued() +/datum/controller/subsystem/garbage/proc/HandleToBeQueued() var/list/tobequeued = src.tobequeued var/starttime = world.time var/starttimeofday = world.timeofday @@ -70,7 +68,7 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage Queue(ref) tobequeued.Cut(1, 2) -/datum/controller/subsystem/garbage_collector/proc/HandleQueue() +/datum/controller/subsystem/garbage/proc/HandleQueue() delslasttick = 0 gcedlasttick = 0 var/time_to_kill = world.time - collection_timeout // Anything qdel() but not GC'd BEFORE this time needs to be manually del() @@ -124,12 +122,12 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage ++gcedlasttick ++totalgcs -/datum/controller/subsystem/garbage_collector/proc/QueueForQueuing(datum/A) +/datum/controller/subsystem/garbage/proc/QueueForQueuing(datum/A) if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) tobequeued += A A.gc_destroyed = GC_QUEUED_FOR_QUEUING -/datum/controller/subsystem/garbage_collector/proc/Queue(datum/A) +/datum/controller/subsystem/garbage/proc/Queue(datum/A) if (!istype(A) || (!isnull(A.gc_destroyed) && A.gc_destroyed >= 0)) return if (A.gc_destroyed == GC_QUEUED_FOR_HARD_DEL) @@ -145,12 +143,12 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage queue[refid] = gctime -/datum/controller/subsystem/garbage_collector/proc/HardQueue(datum/A) +/datum/controller/subsystem/garbage/proc/HardQueue(datum/A) if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) tobequeued += A A.gc_destroyed = GC_QUEUED_FOR_HARD_DEL -/datum/controller/subsystem/garbage_collector/Recover() +/datum/controller/subsystem/garbage/Recover() if (istype(SSgarbage.queue)) queue |= SSgarbage.queue if (istype(SSgarbage.tobequeued))