mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-22 12:29:46 +01:00
Updated SSAtoms to TG's version (#18032)
* emperor protects * sdfas * sadf * sdf
This commit is contained in:
@@ -1,10 +1,4 @@
|
||||
#define SUBSYSTEM_INIT_SOURCE "subsystem init"
|
||||
|
||||
#define BAD_INIT_QDEL_BEFORE 1
|
||||
#define BAD_INIT_DIDNT_INIT 2
|
||||
#define BAD_INIT_SLEPT 4
|
||||
#define BAD_INIT_NO_HINT 8
|
||||
|
||||
SUBSYSTEM_DEF(atoms)
|
||||
name = "Atoms"
|
||||
init_order = SS_INIT_ATOMS
|
||||
@@ -15,159 +9,106 @@ SUBSYSTEM_DEF(atoms)
|
||||
var/list/initialized_state = list()
|
||||
var/base_initialized
|
||||
|
||||
var/initialized = INITIALIZATION_INSSATOMS
|
||||
var/old_initialized
|
||||
|
||||
var/list/late_misc_firers // this is a list of things that fire when late misc init is called
|
||||
|
||||
var/list/late_loaders
|
||||
var/list/created_atoms
|
||||
var/list/late_qdel
|
||||
var/list/late_loaders = list()
|
||||
|
||||
var/list/BadInitializeCalls = list()
|
||||
|
||||
///initAtom() adds the atom its creating to this list iff InitializeAtoms() has been given a list to populate as an argument
|
||||
var/list/created_atoms
|
||||
|
||||
/// Atoms that will be deleted once the subsystem is initialized
|
||||
var/list/queued_deletions = list()
|
||||
|
||||
var/init_start_time
|
||||
|
||||
#ifdef PROFILE_MAPLOAD_INIT_ATOM
|
||||
var/list/mapload_init_times = list()
|
||||
#endif
|
||||
|
||||
initialized = INITIALIZATION_INSSATOMS
|
||||
|
||||
/datum/controller/subsystem/atoms/Initialize(timeofday)
|
||||
init_start_time = world.time
|
||||
|
||||
initialized = INITIALIZATION_INNEW_MAPLOAD
|
||||
InitializeAtoms()
|
||||
initialized = INITIALIZATION_INNEW_REGULAR
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms)
|
||||
/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms, list/atoms_to_return)
|
||||
if(initialized == INITIALIZATION_INSSATOMS)
|
||||
return
|
||||
|
||||
set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, SUBSYSTEM_INIT_SOURCE)
|
||||
|
||||
LAZYINITLIST(late_loaders)
|
||||
LAZYINITLIST(late_qdel)
|
||||
|
||||
var/count
|
||||
var/list/mapload_arg = list(TRUE)
|
||||
if(atoms)
|
||||
created_atoms = list()
|
||||
count = atoms.len
|
||||
for(var/I in 1 to atoms.len)
|
||||
var/atom/A = atoms[I]
|
||||
InitAtom(A, mapload_arg)
|
||||
CHECK_TICK
|
||||
else
|
||||
count = 0
|
||||
for(var/atom/A as anything in world)
|
||||
if(!A.initialized)
|
||||
InitAtom(A, mapload_arg)
|
||||
++count
|
||||
CHECK_TICK
|
||||
|
||||
admin_notice(SPAN_DANGER("Initialized [count] atoms."), R_DEBUG)
|
||||
log_subsystem("atoms", "Initialized [count] atoms.")
|
||||
|
||||
// This may look a bit odd, but if the actual atom creation runtimes for some reason, we absolutely need to set initialized BACK
|
||||
CreateAtoms(atoms, atoms_to_return)
|
||||
clear_tracked_initalize(SUBSYSTEM_INIT_SOURCE)
|
||||
|
||||
if(late_loaders.len)
|
||||
for(var/I in 1 to late_loaders.len)
|
||||
var/atom/A = late_loaders[I]
|
||||
//I hate that we need this
|
||||
if(QDELETED(A))
|
||||
continue
|
||||
A.LateInitialize()
|
||||
admin_notice(SPAN_DANGER("Late-initialized [late_loaders.len] atoms."), R_DEBUG)
|
||||
log_subsystem("atoms", "Late initialized [late_loaders.len] atoms")
|
||||
testing("Late initialized [late_loaders.len] atoms")
|
||||
late_loaders.Cut()
|
||||
|
||||
if(late_qdel.len)
|
||||
var/num_qdels = late_qdel.len
|
||||
for(var/thing in late_qdel)
|
||||
qdel(thing)
|
||||
if (created_atoms)
|
||||
atoms_to_return += created_atoms
|
||||
created_atoms = null
|
||||
|
||||
admin_notice(SPAN_DANGER("Late-qdeleted [num_qdels] atoms."), R_DEBUG)
|
||||
log_subsystem("atoms", "Late qdeleted [num_qdels] atoms.")
|
||||
for (var/queued_deletion in queued_deletions)
|
||||
qdel(queued_deletion)
|
||||
|
||||
late_qdel.Cut()
|
||||
testing("[queued_deletions.len] atoms were queued for deletion.")
|
||||
queued_deletions.Cut()
|
||||
|
||||
#ifdef PROFILE_MAPLOAD_INIT_ATOM
|
||||
rustg_file_write(json_encode(mapload_init_times), "[GLOB.log_directory]/init_times.json")
|
||||
#endif
|
||||
|
||||
/// Actually creates the list of atoms. Exists soley so a runtime in the creation logic doesn't cause initalized to totally break
|
||||
/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null)
|
||||
if (atoms_to_return)
|
||||
LAZYINITLIST(created_atoms)
|
||||
|
||||
#ifdef TESTING
|
||||
var/count
|
||||
#endif
|
||||
|
||||
var/list/mapload_arg = list(TRUE)
|
||||
|
||||
if(atoms)
|
||||
. = created_atoms + atoms
|
||||
created_atoms = null
|
||||
// Note this doesn't actually do anything because we didn't finish porting TG init :^)
|
||||
#ifdef TESTING
|
||||
count = atoms.len
|
||||
#endif
|
||||
|
||||
/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments)
|
||||
var/the_type = A.type
|
||||
if(QDELING(A))
|
||||
BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE
|
||||
return TRUE
|
||||
for(var/I in 1 to atoms.len)
|
||||
var/atom/A = atoms[I]
|
||||
if(!(A.flags_1 & INITIALIZED_1))
|
||||
CHECK_TICK
|
||||
PROFILE_INIT_ATOM_BEGIN()
|
||||
InitAtom(A, TRUE, mapload_arg)
|
||||
PROFILE_INIT_ATOM_END(A)
|
||||
else
|
||||
#ifdef TESTING
|
||||
count = 0
|
||||
#endif
|
||||
|
||||
var/start_tick = world.time
|
||||
for(var/atom/A as anything in world)
|
||||
if(!(A.flags_1 & INITIALIZED_1))
|
||||
PROFILE_INIT_ATOM_BEGIN()
|
||||
InitAtom(A, FALSE, mapload_arg)
|
||||
PROFILE_INIT_ATOM_END(A)
|
||||
#ifdef TESTING
|
||||
++count
|
||||
#endif
|
||||
CHECK_TICK
|
||||
|
||||
var/result = A.Initialize(arglist(arguments))
|
||||
|
||||
if(start_tick != world.time)
|
||||
BadInitializeCalls[the_type] |= BAD_INIT_SLEPT
|
||||
|
||||
if(result !=INITIALIZE_HINT_NORMAL)
|
||||
switch(result)
|
||||
if(INITIALIZE_HINT_LATELOAD)
|
||||
if(arguments[1]) //mapload
|
||||
late_loaders += A
|
||||
else
|
||||
A.LateInitialize()
|
||||
if(INITIALIZE_HINT_QDEL)
|
||||
qdel(A)
|
||||
return TRUE
|
||||
if(INITIALIZE_HINT_LATEQDEL)
|
||||
if(arguments[1]) //mapload
|
||||
late_qdel += A
|
||||
else
|
||||
qdel(A)
|
||||
return TRUE
|
||||
else
|
||||
BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT
|
||||
|
||||
if(!A) //possible harddel
|
||||
return TRUE
|
||||
else if(!A.initialized)
|
||||
BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT
|
||||
|
||||
return QDELETED(A)
|
||||
|
||||
/datum/controller/subsystem/atoms/proc/ForceInitializeContents(atom/A)
|
||||
var/list/mload_args = list(TRUE)
|
||||
var/loaded = 0
|
||||
|
||||
set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, SUBSYSTEM_INIT_SOURCE+"- ForceInitializeContents: [text_ref(A)]")
|
||||
|
||||
for (var/thing in A)
|
||||
var/atom/movable/AM = thing
|
||||
if (!AM.initialized)
|
||||
InitAtom(AM, mload_args)
|
||||
++loaded
|
||||
|
||||
clear_tracked_initalize(SUBSYSTEM_INIT_SOURCE+"- ForceInitializeContents: [text_ref(A)]")
|
||||
|
||||
LOG_DEBUG("atoms: force-loaded [loaded] out of [A.contents.len] atoms in [A].")
|
||||
|
||||
/datum/controller/subsystem/atoms/proc/InitLog()
|
||||
. = ""
|
||||
for(var/path in BadInitializeCalls)
|
||||
. += "Path : [path] \n"
|
||||
var/fails = BadInitializeCalls[path]
|
||||
if(fails & BAD_INIT_DIDNT_INIT)
|
||||
. += "- Didn't call atom/Initialize()\n"
|
||||
if(fails & BAD_INIT_NO_HINT)
|
||||
. += "- Didn't return an Initialize hint\n"
|
||||
if(fails & BAD_INIT_QDEL_BEFORE)
|
||||
. += "- Qdel'd in New()\n"
|
||||
if(fails & BAD_INIT_SLEPT)
|
||||
. += "- Slept during Initialize()\n"
|
||||
|
||||
/*datum/controller/subsystem/atoms/Shutdown()
|
||||
var/initlog = InitLog()
|
||||
if(initlog)
|
||||
world.log << initlog*/
|
||||
|
||||
/datum/controller/subsystem/atoms/Recover()
|
||||
initialized = SSatoms.initialized
|
||||
if(initialized == INITIALIZATION_INNEW_MAPLOAD)
|
||||
InitializeAtoms()
|
||||
initialized_state = SSatoms.initialized_state
|
||||
BadInitializeCalls = SSatoms.BadInitializeCalls
|
||||
testing("Initialized [count] atoms")
|
||||
|
||||
/datum/controller/subsystem/atoms/proc/map_loader_begin(source)
|
||||
set_tracked_initalized(INITIALIZATION_INSSATOMS, source)
|
||||
@@ -201,4 +142,40 @@ SUBSYSTEM_DEF(atoms)
|
||||
/datum/controller/subsystem/atoms/proc/initializing_something()
|
||||
return length(initialized_state) > 1
|
||||
|
||||
/datum/controller/subsystem/atoms/Recover()
|
||||
initialized = SSatoms.initialized
|
||||
if(initialized == INITIALIZATION_INNEW_MAPLOAD)
|
||||
InitializeAtoms()
|
||||
initialized_state = SSatoms.initialized_state
|
||||
BadInitializeCalls = SSatoms.BadInitializeCalls
|
||||
|
||||
/datum/controller/subsystem/atoms/proc/InitLog()
|
||||
. = ""
|
||||
for(var/path in BadInitializeCalls)
|
||||
. += "Path : [path] \n"
|
||||
var/fails = BadInitializeCalls[path]
|
||||
if(fails & BAD_INIT_DIDNT_INIT)
|
||||
. += "- Didn't call atom/Initialize()\n"
|
||||
if(fails & BAD_INIT_NO_HINT)
|
||||
. += "- Didn't return an Initialize hint\n"
|
||||
if(fails & BAD_INIT_QDEL_BEFORE)
|
||||
. += "- Qdel'd in New()\n"
|
||||
if(fails & BAD_INIT_SLEPT)
|
||||
. += "- Slept during Initialize()\n"
|
||||
|
||||
/// Prepares an atom to be deleted once the atoms SS is initialized.
|
||||
/datum/controller/subsystem/atoms/proc/prepare_deletion(atom/target)
|
||||
if (initialized == INITIALIZATION_INNEW_REGULAR)
|
||||
// Atoms SS has already completed, just kill it now.
|
||||
qdel(target)
|
||||
else
|
||||
queued_deletions += WEAKREF(target)
|
||||
|
||||
/datum/controller/subsystem/atoms/Shutdown()
|
||||
var/initlog = InitLog()
|
||||
if(initlog)
|
||||
world.log << initlog
|
||||
//text2file(initlog, "[log_directory]/initialize.log")
|
||||
|
||||
|
||||
#undef SUBSYSTEM_INIT_SOURCE
|
||||
|
||||
@@ -27,9 +27,9 @@ SUBSYSTEM_DEF(misc_late)
|
||||
populate_code_phrases()
|
||||
|
||||
// this covers mapped in drone fabs
|
||||
for(var/atom/thing as anything in SSatoms.late_misc_firers)
|
||||
for(var/atom/thing as anything in SSatoms.late_loaders)
|
||||
thing.do_late_fire()
|
||||
LAZYREMOVE(SSatoms.late_misc_firers, thing)
|
||||
LAZYREMOVE(SSatoms.late_loaders, thing)
|
||||
|
||||
if (config.use_forumuser_api)
|
||||
update_admins_from_api(TRUE)
|
||||
|
||||
Reference in New Issue
Block a user