From 5c95967cad8038a00f1594e30daca53a08a3f8df Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 21 Aug 2021 16:16:26 +0200 Subject: [PATCH] QDEL_IN harddel prevention (#60937) (#7669) QDEL_IN could hardel if the timer was greater than 5 minutes (time for the qdel queue) we can use weakref to prevent this Co-authored-by: BraveMole --- code/__DEFINES/qdel.dm | 4 ++++ code/__HELPERS/qdel.dm | 2 +- code/controllers/subsystem/garbage.dm | 2 +- code/game/objects/items/crab17.dm | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 643774c83a0..32e0025ab2a 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -35,6 +35,10 @@ #define GC_QUEUED_FOR_QUEUING -1 #define GC_CURRENTLY_BEING_QDELETED -2 +// Defines for the time left for an item to get its reference cleaned +#define GC_FILTER_QUEUE 5 MINUTES +#define GC_DEL_QUEUE 10 SECONDS + #define QDELING(X) (X.gc_destroyed) #define QDELETED(X) (!X || QDELING(X)) #define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) diff --git a/code/__HELPERS/qdel.dm b/code/__HELPERS/qdel.dm index 0d2bf891529..70b9e4c6a39 100644 --- a/code/__HELPERS/qdel.dm +++ b/code/__HELPERS/qdel.dm @@ -1,4 +1,4 @@ -#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE) +#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, time > GC_FILTER_QUEUE ? WEAKREF(item) : item), time, TIMER_STOPPABLE) #define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME) #define QDEL_NULL(item) qdel(item); item = null #define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); } diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index e9b69d5da1a..7f7d301a1d1 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(garbage) runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY init_order = INIT_ORDER_GARBAGE - var/list/collection_timeout = list(5 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level + var/list/collection_timeout = list(GC_FILTER_QUEUE, GC_DEL_QUEUE) // deciseconds to wait before moving something up in the queue to the next level //Stat tracking var/delslasttick = 0 // number of del()'s we've done this tick diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index ba322f772b4..78928efa03e 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -87,7 +87,7 @@ add_overlay("hatch") add_overlay("legs_retracted") addtimer(CALLBACK(src, .proc/startUp), 50) - QDEL_IN(WEAKREF(src), 8 MINUTES) //Self-destruct after 8 min + QDEL_IN(src, 8 MINUTES) //Self-destruct after 8 min SSeconomy.market_crashing = TRUE