mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-18 19:39:42 +01:00
e4192f9b8f
we have a gorillion hard deletions and it turns out half of them are because we set the "ALWAYS HARD DELETE THIS" flag rather than just like. fixing the hard delete. cool
79 lines
4.6 KiB
Plaintext
79 lines
4.6 KiB
Plaintext
//! Defines that give qdel hints.
|
|
//!
|
|
//! These can be given as a return in [/atom/proc/Destroy] or by calling [/proc/qdel].
|
|
|
|
/// `qdel` should queue the object for deletion.
|
|
#define QDEL_HINT_QUEUE 0
|
|
/// `qdel` should let the object live after calling [/atom/proc/Destroy].
|
|
#define QDEL_HINT_LETMELIVE 1
|
|
/// Functionally the same as the above. `qdel` should assume the object will gc on its own, and not check it.
|
|
#define QDEL_HINT_IWILLGC 2
|
|
/// Qdel should assume this object won't GC, and queue a hard delete using a hard reference.
|
|
#define QDEL_HINT_HARDDEL 3
|
|
// Qdel should assume this object won't gc, and hard delete it posthaste.
|
|
#define QDEL_HINT_HARDDEL_NOW 4
|
|
|
|
|
|
#ifdef REFERENCE_TRACKING
|
|
|
|
//A warning on compile is treated as an error in the CI, therefore unlike TG we must avoid the warn if it's running in the CI
|
|
#if defined(TESTING) && !defined(CIBUILDING) && !defined(OPENDREAM) && !defined(SPACEMAN_DMM)
|
|
/* If REFERENCE_TRACKING is enabled, qdel will call this object's find_references() verb.
|
|
|
|
Functionally identical to [QDEL_HINT_QUEUE] if [GC_FAILURE_HARD_LOOKUP] is not enabled in _compiler_options.dm.
|
|
*/
|
|
#warn TG0001 qdel REFERENCE_TRACKING enabled
|
|
#endif
|
|
|
|
#define QDEL_HINT_FINDREFERENCE 5
|
|
/// Behavior as [QDEL_HINT_FINDREFERENCE], but only if the GC fails and a hard delete is forced.
|
|
#define QDEL_HINT_IFFAIL_FINDREFERENCE 6
|
|
#endif
|
|
|
|
// Defines for the ssgarbage queues
|
|
#define GC_QUEUE_FILTER 1 //! short queue to filter out quick gc successes so they don't hang around in the main queue for 5 minutes
|
|
#define GC_QUEUE_CHECK 2 //! main queue that waits 5 minutes because thats the longest byond can hold a reference to our shit.
|
|
#define GC_QUEUE_HARDDELETE 3 //! short queue for things that hard delete instead of going thru the gc subsystem, this is purely so if they *can* softdelete, they will soft delete rather then wasting time with a hard delete.
|
|
#define GC_QUEUE_COUNT 3 //! Number of queues, used for allocating the nested lists. Don't forget to increase this if you add a new queue stage
|
|
|
|
|
|
// Defines for the ssgarbage queue items
|
|
#define GC_QUEUE_ITEM_QUEUE_TIME 1 //! Time this item entered the queue
|
|
#define GC_QUEUE_ITEM_REF 2 //! Ref to the item
|
|
#define GC_QUEUE_ITEM_GCD_DESTROYED 3 //! Item's gc_destroyed var value. Used to detect ref reuse.
|
|
#define GC_QUEUE_ITEM_INDEX_COUNT 3 //! Number of item indexes, used for allocating the nested lists. Don't forget to increase this if you add a new queue item index
|
|
|
|
// Defines for the time an item has to get its reference cleaned before it fails the queue and moves to the next.
|
|
#define GC_FILTER_QUEUE (1 SECONDS)
|
|
#define GC_CHECK_QUEUE (5 MINUTES)
|
|
#define GC_DEL_QUEUE (10 SECONDS)
|
|
|
|
|
|
#define QDEL_ITEM_ADMINS_WARNED (1<<0) //! Set when admins are told about lag causing qdels in this type.
|
|
#define QDEL_ITEM_SUSPENDED_FOR_LAG (1<<1) //! Set when a type can no longer be hard deleted on failure because of lag it causes while this happens.
|
|
|
|
// Defines for the [gc_destroyed][/datum/var/gc_destroyed] var.
|
|
#define GC_CURRENTLY_BEING_QDELETED -2
|
|
|
|
#define QDELING(X) (X.gc_destroyed)
|
|
#define QDELETED(X) (isnull(X) || QDELING(X))
|
|
#define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
|
|
|
|
// This is a bit hacky, we do it to avoid people relying on a return value for the macro
|
|
// If you need that you should use QDEL_IN_STOPPABLE instead
|
|
#define QDEL_IN(item, time) ; \
|
|
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time, TIMER_DELETE_ME);
|
|
#define QDEL_IN_STOPPABLE(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time, TIMER_STOPPABLE | TIMER_DELETE_ME)
|
|
#define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME | TIMER_DELETE_ME)
|
|
|
|
//Bay uses the check before deleting something, to ensure it's not null, TG does not, and since I don't want to go hunt down 3 billion runtimes, we keep bay's version
|
|
|
|
///Delete and null the reference, if the object isn't null
|
|
#define QDEL_NULL(item) if(item) { qdel(item) ; item = null }
|
|
#define QDEL_NULL_LIST(x) if(x) { for(var/y in x) { qdel(y) }}; if(x) {x.Cut(); x = null } // Second x check to handle items that LAZYREMOVE on qdel.
|
|
|
|
#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); }
|
|
#define QDEL_LIST_IN(L, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(______qdel_list_wrapper), L), time, TIMER_STOPPABLE)
|
|
#define QDEL_LIST_ASSOC(L) if(L) { for(var/I in L) { qdel(L[I]); qdel(I); } L.Cut(); }
|
|
#define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qdel(L[I]); L.Cut(); }
|