mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-13 17:07:53 +01:00
Fix several hard-dels, add harddel ref tracking (#16174)
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
* Pretty much pokes the MC to make sure it's still alive.
|
||||
**/
|
||||
|
||||
#define FAILSAFE_MSG(msg) admin_notice("<big><em><span class='warning'>FAILSAFE: </span><font color='black'>[msg]</font></em></big>", R_DEBUG|R_ADMIN|R_DEV)
|
||||
#define FAILSAFE_MSG(msg) admin_notice("<big><em><span class='warning'>FAILSAFE: </span><font color='#ff8800'>[msg]</font></em></big>", R_DEBUG|R_ADMIN|R_DEV)
|
||||
|
||||
var/datum/controller/failsafe/Failsafe
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#ifdef TESTING
|
||||
#ifdef REFERENCE_TRACKING
|
||||
|
||||
/datum/var/running_find_references
|
||||
/datum/var/last_find_references = 0
|
||||
@@ -11,62 +11,6 @@
|
||||
|
||||
find_references(FALSE)
|
||||
|
||||
/datum/proc/find_references(skip_alert)
|
||||
running_find_references = type
|
||||
if(usr && usr.client)
|
||||
if(usr.client.running_find_references)
|
||||
testing("CANCELLED search for references to a [usr.client.running_find_references].")
|
||||
usr.client.running_find_references = null
|
||||
running_find_references = null
|
||||
//restart the garbage collector
|
||||
SSgarbage.can_fire = 1
|
||||
SSgarbage.next_fire = world.time + world.tick_lag
|
||||
return
|
||||
|
||||
if(!skip_alert)
|
||||
if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") == "No")
|
||||
running_find_references = null
|
||||
return
|
||||
|
||||
//this keeps the garbage collector from failing to collect objects being searched for in here
|
||||
SSgarbage.can_fire = 0
|
||||
|
||||
if(usr && usr.client)
|
||||
usr.client.running_find_references = type
|
||||
|
||||
testing("Beginning search for references to a [type].")
|
||||
last_find_references = world.time
|
||||
find_references_in_globals()
|
||||
for(var/datum/thing in world)
|
||||
DoSearchVar(thing, "WorldRef: [thing]")
|
||||
testing("Completed search for references to a [type].")
|
||||
if(usr && usr.client)
|
||||
usr.client.running_find_references = null
|
||||
running_find_references = null
|
||||
|
||||
//restart the garbage collector
|
||||
SSgarbage.can_fire = 1
|
||||
SSgarbage.next_fire = world.time + world.tick_lag
|
||||
|
||||
/client/verb/purge_all_destroyed_objects()
|
||||
set category = "Debug"
|
||||
if(SSgarbage)
|
||||
while(SSgarbage.queue.len)
|
||||
var/datum/o = locate(SSgarbage.queue[1])
|
||||
if(istype(o) && o.gcDestroyed)
|
||||
del(o)
|
||||
SSgarbage.totaldels++
|
||||
SSgarbage.queue.Cut(1, 2)
|
||||
|
||||
/datum/verb/qdel_then_find_references(datum/thing in world)
|
||||
set category = "Debug"
|
||||
set name = "qdel() then Find References"
|
||||
set background = 1
|
||||
|
||||
qdel(thing)
|
||||
if(!thing.running_find_references)
|
||||
thing.find_references(TRUE)
|
||||
|
||||
/client/verb/show_qdeleted()
|
||||
set category = "Debug"
|
||||
set name = "Show qdel() Log"
|
||||
@@ -80,779 +24,136 @@
|
||||
tmplist[elem] = 0
|
||||
tmplist[elem]++
|
||||
|
||||
sortTim(tmplist, GLOBAL_PROC_REF(cmp_numeric_dsc), TRUE)
|
||||
|
||||
for(var/path in tmplist)
|
||||
dat += "[path] - [tmplist[path]] times<BR>"
|
||||
|
||||
usr << browse(dat, "window=qdeletedlog")
|
||||
|
||||
#define SearchVar(X) DoSearchVar(X, "Global: " + #X)
|
||||
|
||||
/datum/proc/DoSearchVar(X, Xname)
|
||||
if(usr && usr.client && !usr.client.running_find_references) return
|
||||
if(istype(X, /datum))
|
||||
var/datum/D = X
|
||||
if(D.last_find_references == last_find_references)
|
||||
/datum/proc/find_references(skip_alert)
|
||||
running_find_references = type
|
||||
if(usr?.client)
|
||||
if(usr.client.running_find_references)
|
||||
testing("CANCELLED search for references to a [usr.client.running_find_references].")
|
||||
usr.client.running_find_references = null
|
||||
running_find_references = null
|
||||
SSgarbage.enable()
|
||||
return
|
||||
D.last_find_references = last_find_references
|
||||
for(var/V in D.vars)
|
||||
for(var/varname in D.vars)
|
||||
var/variable = D.vars[varname]
|
||||
if(variable == src)
|
||||
testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]")
|
||||
else if(islist(variable))
|
||||
if(src in variable)
|
||||
testing("Found [src.type] \ref[src] in [D.type]'s [varname] list var. Global: [Xname]")
|
||||
#ifdef GC_FAILURE_HARD_LOOKUP
|
||||
for(var/I in variable)
|
||||
DoSearchVar(I, TRUE)
|
||||
else
|
||||
DoSearchVar(variable, "[Xname]: [varname]")
|
||||
#endif
|
||||
else if(islist(X))
|
||||
if(src in X)
|
||||
testing("Found [src.type] \ref[src] in list [Xname].")
|
||||
#ifdef GC_FAILURE_HARD_LOOKUP
|
||||
for(var/I in X)
|
||||
DoSearchVar(I, Xname + ": list")
|
||||
#else
|
||||
|
||||
if(!skip_alert && alert(usr, "Running this will lock everything up for 5+ minutes. Would you like to begin the search?", "Find References", "Yes", "No") != "Yes")
|
||||
running_find_references = null
|
||||
return
|
||||
|
||||
SSgarbage.disable() // Keeps the GC from failing to collect objects being searched for here
|
||||
|
||||
if(usr?.client)
|
||||
usr.client.running_find_references = type
|
||||
|
||||
//Time to search the whole game for our ref
|
||||
testing("Beginning search for references to a [type].")
|
||||
var/starting_time = world.time
|
||||
|
||||
//Yes we do actually need to do this. The searcher refuses to read weird lists
|
||||
//And global.vars is a really weird list
|
||||
var/global_vars = list()
|
||||
for(var/key in global.vars)
|
||||
global_vars[key] = global.vars[key]
|
||||
|
||||
search_var(global_vars, "Native Global", search_time = starting_time)
|
||||
testing("Finished searching native globals")
|
||||
|
||||
for(var/datum/thing in world) // atoms (don't believe its lies)
|
||||
search_var(thing, "World -> [thing.type]", search_time = starting_time)
|
||||
testing("Finished searching atoms")
|
||||
|
||||
for(var/datum/thing) // datums
|
||||
search_var(thing, "Datums -> [thing.type]", search_time = starting_time)
|
||||
testing("Finished searching datums")
|
||||
|
||||
//Warning, attempting to search clients like this will cause crashes if done on live. Watch yourself
|
||||
for(var/client/thing) // clients
|
||||
search_var(thing, "Clients -> [thing.type]", search_time = starting_time)
|
||||
testing("Finished searching clients")
|
||||
|
||||
testing("Completed all searches for references to a [type].")
|
||||
|
||||
if(usr?.client)
|
||||
usr.client.running_find_references = null
|
||||
running_find_references = null
|
||||
|
||||
SSgarbage.enable() //restart the garbage collector
|
||||
|
||||
/datum/proc/search_var(potential_container, container_name, recursive_limit = 64, search_time = world.time)
|
||||
|
||||
if(usr?.client && !usr.client.running_find_references)
|
||||
return
|
||||
|
||||
if(!recursive_limit)
|
||||
testing("Recursion limit reached. [container_name]")
|
||||
return
|
||||
|
||||
//Check each time you go down a layer. This makes it a bit slow, but it won't effect the rest of the game at all
|
||||
#ifndef FIND_REF_NO_CHECK_TICK
|
||||
CHECK_TICK
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if(isdatum(potential_container))
|
||||
var/datum/datum_container = potential_container
|
||||
if(datum_container.last_find_references == search_time)
|
||||
return
|
||||
|
||||
/datum/proc/find_references_in_globals()
|
||||
SearchVar(all_areas)
|
||||
SearchVar(processing_power_items)
|
||||
SearchVar(med_hud_users)
|
||||
SearchVar(sec_hud_users)
|
||||
SearchVar(hud_icon_reference)
|
||||
SearchVar(janitorial_supplies)
|
||||
SearchVar(world_phylactery)
|
||||
SearchVar(listening_objects)
|
||||
SearchVar(global_mutations)
|
||||
SearchVar(universe)
|
||||
SearchVar(global_map)
|
||||
SearchVar(hit_appends)
|
||||
SearchVar(map_levels)
|
||||
SearchVar(diary)
|
||||
SearchVar(diary_runtime)
|
||||
SearchVar(diary_date_string)
|
||||
SearchVar(href_logfile)
|
||||
SearchVar(station_name)
|
||||
SearchVar(station_short)
|
||||
SearchVar(dock_name)
|
||||
SearchVar(boss_name)
|
||||
SearchVar(boss_short)
|
||||
SearchVar(company_name)
|
||||
SearchVar(company_short)
|
||||
SearchVar(game_version)
|
||||
SearchVar(changelog_hash)
|
||||
SearchVar(game_year)
|
||||
SearchVar(round_progressing)
|
||||
SearchVar(master_mode)
|
||||
SearchVar(secret_force_mode)
|
||||
SearchVar(bombers)
|
||||
SearchVar(admin_log)
|
||||
SearchVar(lastsignalers)
|
||||
SearchVar(lawchanges)
|
||||
SearchVar(reg_dna)
|
||||
SearchVar(newplayer_start)
|
||||
SearchVar(latejoin)
|
||||
SearchVar(latejoin_gateway)
|
||||
SearchVar(latejoin_cryo)
|
||||
SearchVar(latejoin_cyborg)
|
||||
SearchVar(latejoin_merchant)
|
||||
SearchVar(latejoin_living_quarters_lift)
|
||||
SearchVar(kickoffsloc)
|
||||
SearchVar(tdome1)
|
||||
SearchVar(tdome2)
|
||||
SearchVar(tdomeobserve)
|
||||
SearchVar(tdomeadmin)
|
||||
SearchVar(ninjastart)
|
||||
SearchVar(cardinal)
|
||||
SearchVar(cornerdirs)
|
||||
SearchVar(alldirs)
|
||||
SearchVar(reverse_dir)
|
||||
SearchVar(config)
|
||||
SearchVar(combatlog)
|
||||
SearchVar(IClog)
|
||||
SearchVar(OOClog)
|
||||
SearchVar(adminlog)
|
||||
SearchVar(Debug2)
|
||||
SearchVar(debugobj)
|
||||
SearchVar(mods)
|
||||
SearchVar(gravity_is_on)
|
||||
SearchVar(awaydestinations)
|
||||
SearchVar(fileaccess_timer)
|
||||
SearchVar(custom_event_msg)
|
||||
SearchVar(dbcon)
|
||||
SearchVar(alphabet_uppercase)
|
||||
SearchVar(robot_module_types)
|
||||
SearchVar(scarySounds)
|
||||
SearchVar(max_explosion_range)
|
||||
SearchVar(global_announcer)
|
||||
SearchVar(station_departments)
|
||||
SearchVar(TICKS_IN_DAY)
|
||||
SearchVar(TICKS_IN_HOUR)
|
||||
SearchVar(TICKS_IN_SECOND)
|
||||
SearchVar(exo_beacons)
|
||||
SearchVar(ai_names)
|
||||
SearchVar(wizard_first)
|
||||
SearchVar(wizard_second)
|
||||
SearchVar(ninja_titles)
|
||||
SearchVar(ninja_names)
|
||||
SearchVar(commando_names)
|
||||
SearchVar(first_names_male)
|
||||
SearchVar(first_names_female)
|
||||
SearchVar(last_names)
|
||||
SearchVar(clown_names)
|
||||
SearchVar(verbs)
|
||||
SearchVar(adjectives)
|
||||
SearchVar(init)
|
||||
SearchVar(world_api_rate_limit)
|
||||
SearchVar(tachycardics)
|
||||
SearchVar(bradycardics)
|
||||
SearchVar(heartstopper)
|
||||
SearchVar(cheartstopper)
|
||||
SearchVar(BLINDBLOCK)
|
||||
SearchVar(DEAFBLOCK)
|
||||
SearchVar(HULKBLOCK)
|
||||
SearchVar(TELEBLOCK)
|
||||
SearchVar(FIREBLOCK)
|
||||
SearchVar(XRAYBLOCK)
|
||||
SearchVar(CLUMSYBLOCK)
|
||||
SearchVar(FAKEBLOCK)
|
||||
SearchVar(COUGHBLOCK)
|
||||
SearchVar(GLASSESBLOCK)
|
||||
SearchVar(EPILEPSYBLOCK)
|
||||
SearchVar(TWITCHBLOCK)
|
||||
SearchVar(NERVOUSBLOCK)
|
||||
SearchVar(MONKEYBLOCK)
|
||||
SearchVar(BLOCKADD)
|
||||
SearchVar(DIFFMUT)
|
||||
SearchVar(HEADACHEBLOCK)
|
||||
SearchVar(NOBREATHBLOCK)
|
||||
SearchVar(REMOTEVIEWBLOCK)
|
||||
SearchVar(REGENERATEBLOCK)
|
||||
SearchVar(INCREASERUNBLOCK)
|
||||
SearchVar(REMOTETALKBLOCK)
|
||||
SearchVar(MORPHBLOCK)
|
||||
SearchVar(BLENDBLOCK)
|
||||
SearchVar(HALLUCINATIONBLOCK)
|
||||
SearchVar(NOPRINTSBLOCK)
|
||||
SearchVar(SHOCKIMMUNITYBLOCK)
|
||||
SearchVar(SMALLSIZEBLOCK)
|
||||
SearchVar(restricted_camera_networks)
|
||||
SearchVar(PUB_FREQ)
|
||||
SearchVar(SEC_FREQ)
|
||||
SearchVar(ENG_FREQ)
|
||||
SearchVar(MED_FREQ)
|
||||
SearchVar(SCI_FREQ)
|
||||
SearchVar(SRV_FREQ)
|
||||
SearchVar(SUP_FREQ)
|
||||
SearchVar(radiochannels)
|
||||
SearchVar(CENT_FREQS)
|
||||
SearchVar(CENT_FREQS_ASSOC)
|
||||
SearchVar(ANTAG_FREQS)
|
||||
SearchVar(ANTAG_FREQS_ASSOC)
|
||||
SearchVar(DEPT_FREQS)
|
||||
SearchVar(DEPT_FREQS_ASSOC)
|
||||
SearchVar(url_find_lazy)
|
||||
SearchVar(markup_bold)
|
||||
SearchVar(markup_italics)
|
||||
SearchVar(markup_strike)
|
||||
SearchVar(markup_underline)
|
||||
SearchVar(markup_regex)
|
||||
SearchVar(markup_tags)
|
||||
SearchVar(csrfz_check)
|
||||
SearchVar(gzn_check)
|
||||
SearchVar(clients)
|
||||
SearchVar(admins)
|
||||
SearchVar(directory)
|
||||
SearchVar(player_list)
|
||||
SearchVar(mob_list)
|
||||
SearchVar(human_mob_list)
|
||||
SearchVar(silicon_mob_list)
|
||||
SearchVar(living_mob_list)
|
||||
SearchVar(dead_mob_list)
|
||||
SearchVar(topic_commands)
|
||||
SearchVar(topic_commands_names)
|
||||
SearchVar(landmarks_list)
|
||||
SearchVar(surgery_steps)
|
||||
SearchVar(side_effects)
|
||||
SearchVar(mechas_list)
|
||||
SearchVar(joblist)
|
||||
SearchVar(brig_closets)
|
||||
SearchVar(teleportlocs)
|
||||
SearchVar(ghostteleportlocs)
|
||||
SearchVar(centcom_areas)
|
||||
SearchVar(the_station_areas)
|
||||
SearchVar(station_turfs)
|
||||
SearchVar(implants)
|
||||
SearchVar(turfs)
|
||||
SearchVar(all_species)
|
||||
SearchVar(all_languages)
|
||||
SearchVar(language_keys)
|
||||
SearchVar(whitelisted_species)
|
||||
SearchVar(playable_species)
|
||||
SearchVar(poster_designs)
|
||||
SearchVar(world_uplinks)
|
||||
SearchVar(hair_styles_list)
|
||||
SearchVar(hair_styles_male_list)
|
||||
SearchVar(hair_styles_female_list)
|
||||
SearchVar(facial_hair_styles_list)
|
||||
SearchVar(facial_hair_styles_male_list)
|
||||
SearchVar(facial_hair_styles_female_list)
|
||||
SearchVar(skin_styles_female_list)
|
||||
SearchVar(body_marking_styles_list)
|
||||
SearchVar(backbaglist)
|
||||
SearchVar(pdalist)
|
||||
SearchVar(headsetlist)
|
||||
SearchVar(exclude_jobs)
|
||||
SearchVar(visual_nets)
|
||||
SearchVar(cameranet)
|
||||
SearchVar(escape_list)
|
||||
SearchVar(endgame_exits)
|
||||
SearchVar(endgame_safespawns)
|
||||
SearchVar(syndicate_access)
|
||||
SearchVar(cloaking_devices)
|
||||
SearchVar(church_name)
|
||||
SearchVar(command_name)
|
||||
SearchVar(religion_name)
|
||||
SearchVar(syndicate_name)
|
||||
SearchVar(syndicate_code_phrase)
|
||||
SearchVar(syndicate_code_response)
|
||||
SearchVar(roundstart_hour)
|
||||
SearchVar(round_start_time)
|
||||
SearchVar(real_round_start_time)
|
||||
SearchVar(common_tools)
|
||||
SearchVar(wall_items)
|
||||
SearchVar(sortInstance)
|
||||
SearchVar(cmp_field)
|
||||
SearchVar(tk_maxrange)
|
||||
SearchVar(global_hud)
|
||||
SearchVar(global_huds)
|
||||
SearchVar(robot_inventory)
|
||||
SearchVar(pipe_colors)
|
||||
SearchVar(gamemode_cache)
|
||||
SearchVar(panic_targets)
|
||||
SearchVar(panic_targets_data_loss)
|
||||
SearchVar(Failsafe)
|
||||
SearchVar(Master)
|
||||
SearchVar(CURRENT_TICKLIMIT)
|
||||
SearchVar(SSalarm)
|
||||
SearchVar(SSchemistry)
|
||||
SearchVar(SScargo)
|
||||
SearchVar(SSeconomy)
|
||||
SearchVar(SSeffects)
|
||||
SearchVar(evacuation_controller)
|
||||
SearchVar(SSevents)
|
||||
SearchVar(SSexplosives)
|
||||
SearchVar(SSgarbage)
|
||||
SearchVar(SSlistener)
|
||||
SearchVar(SSicon_smooth)
|
||||
SearchVar(SSipintel)
|
||||
SearchVar(SSlighting)
|
||||
SearchVar(SSnightlight)
|
||||
SearchVar(SSorbit)
|
||||
SearchVar(SSoverlays)
|
||||
SearchVar(SSradio)
|
||||
SearchVar(SSrecords)
|
||||
SearchVar(sun)
|
||||
SearchVar(SScargo)
|
||||
SearchVar(SSticker)
|
||||
SearchVar(SStimer)
|
||||
SearchVar(SSvote)
|
||||
SearchVar(SSatoms)
|
||||
SearchVar(SSxenoarch)
|
||||
SearchVar(SScalamity)
|
||||
SearchVar(SSdisease)
|
||||
SearchVar(SSmodifiers)
|
||||
SearchVar(SSnanoui)
|
||||
SearchVar(SSprocessing)
|
||||
SearchVar(SSshuttle)
|
||||
SearchVar(SSskybox)
|
||||
SearchVar(SSmapping)
|
||||
SearchVar(base_law_type)
|
||||
SearchVar(discord_bot)
|
||||
SearchVar(diseases)
|
||||
SearchVar(modules)
|
||||
SearchVar(archive_diseases)
|
||||
SearchVar(advance_cures)
|
||||
SearchVar(list_symptoms)
|
||||
SearchVar(dictionary_symptoms)
|
||||
SearchVar(SYMPTOM_ACTIVATION_PROB)
|
||||
SearchVar(revdata)
|
||||
SearchVar(camera_repository)
|
||||
SearchVar(crew_repository)
|
||||
SearchVar(uplink)
|
||||
SearchVar(AIRLOCK_WIRE_IDSCAN)
|
||||
SearchVar(AIRLOCK_WIRE_MAIN_POWER1)
|
||||
SearchVar(AIRLOCK_WIRE_MAIN_POWER2)
|
||||
SearchVar(AIRLOCK_WIRE_DOOR_BOLTS)
|
||||
SearchVar(AIRLOCK_WIRE_BACKUP_POWER1)
|
||||
SearchVar(AIRLOCK_WIRE_BACKUP_POWER2)
|
||||
SearchVar(AIRLOCK_WIRE_OPEN_DOOR)
|
||||
SearchVar(AIRLOCK_WIRE_AI_CONTROL)
|
||||
SearchVar(AIRLOCK_WIRE_ELECTRIFY)
|
||||
SearchVar(AIRLOCK_WIRE_SAFETY)
|
||||
SearchVar(AIRLOCK_WIRE_SPEED)
|
||||
SearchVar(AIRLOCK_WIRE_LIGHT)
|
||||
SearchVar(AALARM_WIRE_IDSCAN)
|
||||
SearchVar(AALARM_WIRE_POWER)
|
||||
SearchVar(AALARM_WIRE_SYPHON)
|
||||
SearchVar(AALARM_WIRE_AI_CONTROL)
|
||||
SearchVar(AALARM_WIRE_AALARM)
|
||||
SearchVar(AUTOLATHE_HACK_WIRE)
|
||||
SearchVar(AUTOLATHE_SHOCK_WIRE)
|
||||
SearchVar(AUTOLATHE_DISABLE_WIRE)
|
||||
SearchVar(CAMERA_WIRE_FOCUS)
|
||||
SearchVar(CAMERA_WIRE_POWER)
|
||||
SearchVar(CAMERA_WIRE_LIGHT)
|
||||
SearchVar(CAMERA_WIRE_ALARM)
|
||||
SearchVar(CAMERA_WIRE_NOTHING1)
|
||||
SearchVar(CAMERA_WIRE_NOTHING2)
|
||||
SearchVar(WIRE_EXPLODE)
|
||||
SearchVar(WIRE_POWER1)
|
||||
SearchVar(WIRE_POWER2)
|
||||
SearchVar(WIRE_AVOIDANCE)
|
||||
SearchVar(WIRE_LOADCHECK)
|
||||
SearchVar(WIRE_MOTOR1)
|
||||
SearchVar(WIRE_MOTOR2)
|
||||
SearchVar(WIRE_REMOTE_RX)
|
||||
SearchVar(WIRE_REMOTE_TX)
|
||||
SearchVar(WIRE_BEACON_RX)
|
||||
SearchVar(NUCLEARBOMB_WIRE_LIGHT)
|
||||
SearchVar(NUCLEARBOMB_WIRE_TIMING)
|
||||
SearchVar(NUCLEARBOMB_WIRE_SAFETY)
|
||||
SearchVar(PARTICLE_TOGGLE_WIRE)
|
||||
SearchVar(PARTICLE_STRENGTH_WIRE)
|
||||
SearchVar(PARTICLE_INTERFACE_WIRE)
|
||||
SearchVar(PARTICLE_LIMIT_POWER_WIRE)
|
||||
SearchVar(WIRE_SIGNAL)
|
||||
SearchVar(WIRE_RECEIVE)
|
||||
SearchVar(WIRE_TRANSMIT)
|
||||
SearchVar(BORG_WIRE_LAWCHECK)
|
||||
SearchVar(BORG_WIRE_MAIN_POWER)
|
||||
SearchVar(BORG_WIRE_LOCKED_DOWN)
|
||||
SearchVar(BORG_WIRE_AI_CONTROL)
|
||||
SearchVar(BORG_WIRE_CAMERA)
|
||||
SearchVar(SMARTFRIDGE_WIRE_ELECTRIFY)
|
||||
SearchVar(SMARTFRIDGE_WIRE_THROW)
|
||||
SearchVar(SMARTFRIDGE_WIRE_IDSCAN)
|
||||
SearchVar(SMES_WIRE_RCON)
|
||||
SearchVar(SMES_WIRE_INPUT)
|
||||
SearchVar(SMES_WIRE_OUTPUT)
|
||||
SearchVar(SMES_WIRE_GROUNDING)
|
||||
SearchVar(SMES_WIRE_FAILSAFES)
|
||||
SearchVar(SUIT_STORAGE_WIRE_ELECTRIFY)
|
||||
SearchVar(SUIT_STORAGE_WIRE_SAFETY)
|
||||
SearchVar(SUIT_STORAGE_WIRE_LOCKED)
|
||||
SearchVar(VENDING_WIRE_THROW)
|
||||
SearchVar(VENDING_WIRE_CONTRABAND)
|
||||
SearchVar(VENDING_WIRE_ELECTRIFY)
|
||||
SearchVar(VENDING_WIRE_IDSCAN)
|
||||
SearchVar(same_wires)
|
||||
SearchVar(wireColours)
|
||||
SearchVar(accessible_z_levels)
|
||||
SearchVar(base_turf_by_z)
|
||||
SearchVar(newscaster_standard_feeds)
|
||||
SearchVar(announced_news_types)
|
||||
SearchVar(send_emergency_team)
|
||||
SearchVar(can_call_ert)
|
||||
SearchVar(shatter_sound)
|
||||
SearchVar(explosion_sound)
|
||||
SearchVar(spark_sound)
|
||||
SearchVar(rustle_sound)
|
||||
SearchVar(punch_sound)
|
||||
SearchVar(clown_sound)
|
||||
SearchVar(swing_hit_sound)
|
||||
SearchVar(hiss_sound)
|
||||
SearchVar(page_sound)
|
||||
SearchVar(fracture_sound)
|
||||
SearchVar(blank)
|
||||
SearchVar(catwalk)
|
||||
SearchVar(wood)
|
||||
SearchVar(tiles)
|
||||
SearchVar(plating)
|
||||
SearchVar(carpet)
|
||||
SearchVar(asteroid)
|
||||
SearchVar(grass)
|
||||
SearchVar(water)
|
||||
SearchVar(lava)
|
||||
SearchVar(snow)
|
||||
SearchVar(sand)
|
||||
SearchVar(FALLOFF_SOUNDS)
|
||||
SearchVar(all_antag_types)
|
||||
SearchVar(all_antag_spawnpoints)
|
||||
SearchVar(antag_names_to_ids)
|
||||
SearchVar(bantype_to_antag_age)
|
||||
SearchVar(borers)
|
||||
SearchVar(xenomorphs)
|
||||
SearchVar(actor)
|
||||
SearchVar(commandos)
|
||||
SearchVar(deathsquad)
|
||||
SearchVar(ert)
|
||||
SearchVar(mercs)
|
||||
SearchVar(ninjas)
|
||||
SearchVar(raiders)
|
||||
SearchVar(wizards)
|
||||
SearchVar(cult)
|
||||
SearchVar(highlanders)
|
||||
SearchVar(loyalists)
|
||||
SearchVar(renegades)
|
||||
SearchVar(revs)
|
||||
SearchVar(malf)
|
||||
SearchVar(thralls)
|
||||
SearchVar(traitors)
|
||||
SearchVar(vamp)
|
||||
SearchVar(forced_ambiance_list)
|
||||
SearchVar(dna_activity_bounds)
|
||||
SearchVar(assigned_blocks)
|
||||
SearchVar(dna_genes)
|
||||
SearchVar(eventchance)
|
||||
SearchVar(hadevent)
|
||||
SearchVar(antag_add_failed)
|
||||
SearchVar(additional_antag_types)
|
||||
SearchVar(all_objectives)
|
||||
SearchVar(process_objectives)
|
||||
SearchVar(possible_changeling_IDs)
|
||||
SearchVar(hivemind_bank)
|
||||
SearchVar(powers)
|
||||
SearchVar(powerinstances)
|
||||
SearchVar(narsie_behaviour)
|
||||
SearchVar(narsie_cometh)
|
||||
SearchVar(narsie_list)
|
||||
SearchVar(cultwords)
|
||||
SearchVar(runedec)
|
||||
SearchVar(engwords)
|
||||
SearchVar(rnwords)
|
||||
SearchVar(sacrificed)
|
||||
SearchVar(universe_has_ended)
|
||||
SearchVar(Holiday)
|
||||
SearchVar(nuke_disks)
|
||||
SearchVar(vampirepower_types)
|
||||
SearchVar(vampirepowers)
|
||||
SearchVar(ghost_all_access)
|
||||
SearchVar(ENGSEC)
|
||||
SearchVar(CAPTAIN)
|
||||
SearchVar(HOS)
|
||||
SearchVar(WARDEN)
|
||||
SearchVar(DETECTIVE)
|
||||
SearchVar(OFFICER)
|
||||
SearchVar(CHIEF)
|
||||
SearchVar(ENGINEER)
|
||||
SearchVar(ATMOSTECH)
|
||||
SearchVar(AI)
|
||||
SearchVar(CYBORG)
|
||||
SearchVar(INTERN_SEC)
|
||||
SearchVar(INTERN_ENG)
|
||||
SearchVar(FORENSICS)
|
||||
SearchVar(MEDSCI)
|
||||
SearchVar(RD)
|
||||
SearchVar(SCIENTIST)
|
||||
SearchVar(CHEMIST)
|
||||
SearchVar(CMO)
|
||||
SearchVar(DOCTOR)
|
||||
SearchVar(GENETICIST)
|
||||
SearchVar(VIROLOGIST)
|
||||
SearchVar(PSYCHIATRIST)
|
||||
SearchVar(ROBOTICIST)
|
||||
SearchVar(XENOBIOLOGIST)
|
||||
SearchVar(PARAMEDIC)
|
||||
SearchVar(INTERN_MED)
|
||||
SearchVar(INTERN_SCI)
|
||||
SearchVar(CIVILIAN)
|
||||
SearchVar(HOP)
|
||||
SearchVar(BARTENDER)
|
||||
SearchVar(BOTANIST)
|
||||
SearchVar(CHEF)
|
||||
SearchVar(JANITOR)
|
||||
SearchVar(LIBRARIAN)
|
||||
SearchVar(QUARTERMASTER)
|
||||
SearchVar(CARGOTECH)
|
||||
SearchVar(MINER)
|
||||
SearchVar(LAWYER)
|
||||
SearchVar(CHAPLAIN)
|
||||
SearchVar(CLOWN)
|
||||
SearchVar(MIME)
|
||||
SearchVar(MERCHANT)
|
||||
SearchVar(ASSISTANT)
|
||||
SearchVar(CONSULAR)
|
||||
SearchVar(command_positions)
|
||||
SearchVar(engineering_positions)
|
||||
SearchVar(medical_positions)
|
||||
SearchVar(science_positions)
|
||||
SearchVar(cargo_positions)
|
||||
SearchVar(civilian_positions)
|
||||
SearchVar(security_positions)
|
||||
SearchVar(nonhuman_positions)
|
||||
SearchVar(whitelist)
|
||||
SearchVar(captain_announcement)
|
||||
SearchVar(doppler_arrays)
|
||||
SearchVar(floor_light_cache)
|
||||
SearchVar(HOLOPAD_MODE)
|
||||
SearchVar(navbeacons)
|
||||
SearchVar(SSnews)
|
||||
SearchVar(allCasters)
|
||||
SearchVar(bomb_set)
|
||||
SearchVar(req_console_assistance)
|
||||
SearchVar(req_console_supplies)
|
||||
SearchVar(req_console_information)
|
||||
SearchVar(allConsoles)
|
||||
SearchVar(ai_status_emotions)
|
||||
SearchVar(station_networks)
|
||||
SearchVar(engineering_networks)
|
||||
SearchVar(priority_air_alarms)
|
||||
SearchVar(minor_air_alarms)
|
||||
SearchVar(air_alarm_topic)
|
||||
SearchVar(specops_shuttle_moving_to_station)
|
||||
SearchVar(specops_shuttle_moving_to_centcom)
|
||||
SearchVar(specops_shuttle_at_station)
|
||||
SearchVar(specops_shuttle_can_send)
|
||||
SearchVar(specops_shuttle_time)
|
||||
SearchVar(specops_shuttle_timeleft)
|
||||
SearchVar(syndicate_elite_shuttle_moving_to_station)
|
||||
SearchVar(syndicate_elite_shuttle_moving_to_mothership)
|
||||
SearchVar(syndicate_elite_shuttle_at_station)
|
||||
SearchVar(syndicate_elite_shuttle_can_send)
|
||||
SearchVar(syndicate_elite_shuttle_time)
|
||||
SearchVar(syndicate_elite_shuttle_timeleft)
|
||||
SearchVar(recentmessages)
|
||||
SearchVar(message_delay)
|
||||
SearchVar(word_to_uristrune_table)
|
||||
SearchVar(slot_flags_enumeration)
|
||||
SearchVar(BUMP_TELEPORTERS)
|
||||
SearchVar(active_radio_jammers)
|
||||
SearchVar(default_uplink_selection)
|
||||
SearchVar(chatrooms)
|
||||
SearchVar(PDAs)
|
||||
SearchVar(teleportbeacons)
|
||||
SearchVar(default_internal_channels)
|
||||
SearchVar(default_medbay_channels)
|
||||
SearchVar(rod_recipes)
|
||||
SearchVar(NO_EMAG_ACT)
|
||||
SearchVar(last_chew)
|
||||
SearchVar(tape_roll_applications)
|
||||
SearchVar(malftransformermade)
|
||||
SearchVar(MIN_ACTIVE_TIME)
|
||||
SearchVar(MAX_ACTIVE_TIME)
|
||||
SearchVar(enterloopsanity)
|
||||
SearchVar(flooring_types)
|
||||
SearchVar(random_junk)
|
||||
SearchVar(js_byjax)
|
||||
SearchVar(js_dropdowns)
|
||||
SearchVar(BSACooldown)
|
||||
SearchVar(floorIsLava)
|
||||
SearchVar(admin_ranks)
|
||||
SearchVar(admin_secrets)
|
||||
SearchVar(admin_verbs_default)
|
||||
SearchVar(admin_verbs_admin)
|
||||
SearchVar(admin_verbs_ban)
|
||||
SearchVar(admin_verbs_sounds)
|
||||
SearchVar(admin_verbs_fun)
|
||||
SearchVar(admin_verbs_spawn)
|
||||
SearchVar(admin_verbs_server)
|
||||
SearchVar(admin_verbs_debug)
|
||||
SearchVar(admin_verbs_paranoid_debug)
|
||||
SearchVar(admin_verbs_possess)
|
||||
SearchVar(admin_verbs_permissions)
|
||||
SearchVar(admin_verbs_rejuv)
|
||||
SearchVar(admin_verbs_hideable)
|
||||
SearchVar(admin_verbs_mod)
|
||||
SearchVar(admin_verbs_dev)
|
||||
SearchVar(admin_verbs_cciaa)
|
||||
SearchVar(jobban_keylist)
|
||||
SearchVar(admin_datums)
|
||||
SearchVar(CMinutes)
|
||||
SearchVar(Banlist)
|
||||
SearchVar(adminhelp_ignored_words)
|
||||
SearchVar(checked_for_inactives)
|
||||
SearchVar(inactive_keys)
|
||||
SearchVar(camera_range_display_status)
|
||||
SearchVar(intercom_range_display_status)
|
||||
SearchVar(debug_verbs)
|
||||
SearchVar(prevent_airgroup_regroup)
|
||||
SearchVar(say_disabled)
|
||||
SearchVar(movement_disabled)
|
||||
SearchVar(movement_disabled_exception)
|
||||
SearchVar(forbidden_varedit_object_types)
|
||||
SearchVar(VVlocked)
|
||||
SearchVar(VVicon_edit_lock)
|
||||
SearchVar(VVckey_edit)
|
||||
SearchVar(VVdynamic_lock)
|
||||
SearchVar(sounds_cache)
|
||||
SearchVar(commandos_possible)
|
||||
SearchVar(random_stock_common)
|
||||
SearchVar(random_stock_uncommon)
|
||||
SearchVar(random_stock_rare)
|
||||
SearchVar(random_stock_large)
|
||||
SearchVar(asset_datums)
|
||||
SearchVar(preferences_datums)
|
||||
SearchVar(seen_citizenships)
|
||||
SearchVar(seen_systems)
|
||||
SearchVar(seen_factions)
|
||||
SearchVar(seen_religions)
|
||||
SearchVar(citizenship_choices)
|
||||
SearchVar(home_system_choices)
|
||||
SearchVar(faction_choices)
|
||||
SearchVar(religion_choices)
|
||||
SearchVar(spawntypes)
|
||||
SearchVar(uplink_locations)
|
||||
SearchVar(valid_bloodtypes)
|
||||
SearchVar(gear_tweak_free_color_choice)
|
||||
SearchVar(loadout_categories)
|
||||
SearchVar(gear_datums)
|
||||
SearchVar(breach_brute_descriptors)
|
||||
SearchVar(breach_burn_descriptors)
|
||||
SearchVar(FINGERPRINT_COMPLETE)
|
||||
SearchVar(weighted_randomevent_locations)
|
||||
SearchVar(weighted_mundaneevent_locations)
|
||||
SearchVar(severity_to_string)
|
||||
SearchVar(event_last_fired)
|
||||
SearchVar(dreams)
|
||||
SearchVar(non_fakeattack_weapons)
|
||||
SearchVar(current_map.holodeck_programs)
|
||||
SearchVar(fruit_icon_cache)
|
||||
SearchVar(plant_seed_sprites)
|
||||
SearchVar(wax_recipes)
|
||||
SearchVar(worths)
|
||||
SearchVar(admin_verbs_lighting)
|
||||
SearchVar(liquid_delay)
|
||||
SearchVar(puddles)
|
||||
SearchVar(use_preloader)
|
||||
SearchVar(_preloader)
|
||||
SearchVar(swapmaps_iconcache)
|
||||
SearchVar(SWAPMAPS_SAV)
|
||||
SearchVar(SWAPMAPS_TEXT)
|
||||
SearchVar(swapmaps_mode)
|
||||
SearchVar(swapmaps_compiled_maxx)
|
||||
SearchVar(swapmaps_compiled_maxy)
|
||||
SearchVar(swapmaps_compiled_maxz)
|
||||
SearchVar(swapmaps_initialized)
|
||||
SearchVar(swapmaps_loaded)
|
||||
SearchVar(swapmaps_byname)
|
||||
SearchVar(minevendor_list)
|
||||
SearchVar(total_extraction_beacons)
|
||||
SearchVar(ore_data)
|
||||
SearchVar(dview_mob)
|
||||
SearchVar(holder_mob_icon_cache)
|
||||
SearchVar(slot_equipment_priority)
|
||||
SearchVar(base_miss_chance)
|
||||
SearchVar(organ_rel_size)
|
||||
SearchVar(intents)
|
||||
SearchVar(department_radio_keys)
|
||||
SearchVar(channel_to_radio_key)
|
||||
SearchVar(cleanbot_types)
|
||||
SearchVar(diona_banned_languages)
|
||||
SearchVar(alcohol_clumsy)
|
||||
SearchVar(sparring_attack_cache)
|
||||
SearchVar(MAXIMUM_MEME_POINTS)
|
||||
SearchVar(host_brain)
|
||||
SearchVar(controlling)
|
||||
SearchVar(ai_list)
|
||||
SearchVar(ai_verbs_default)
|
||||
SearchVar(default_ai_icon)
|
||||
SearchVar(ai_icons)
|
||||
SearchVar(empty_playable_ai_cores)
|
||||
SearchVar(pai_emotions)
|
||||
SearchVar(robot_custom_icons)
|
||||
SearchVar(robot_modules)
|
||||
SearchVar(protected_objects)
|
||||
SearchVar(SKILL_NONE)
|
||||
SearchVar(SKILL_BASIC)
|
||||
SearchVar(SKILL_ADEPT)
|
||||
SearchVar(SKILL_EXPERT)
|
||||
SearchVar(SKILLS)
|
||||
SearchVar(SKILL_ENGINEER)
|
||||
SearchVar(SKILL_ORGAN_ROBOTICIST)
|
||||
SearchVar(SKILL_SECURITY_OFFICER)
|
||||
SearchVar(SKILL_CHEMIST)
|
||||
SearchVar(SKILL_PRE)
|
||||
SearchVar(file_uid)
|
||||
SearchVar(comm_message_listeners)
|
||||
SearchVar(global_message_listener)
|
||||
SearchVar(last_message_id)
|
||||
SearchVar(nttransfer_uid)
|
||||
SearchVar(warrant_uid)
|
||||
SearchVar(ntnet_card_uid)
|
||||
SearchVar(ntnet_global)
|
||||
SearchVar(ntnrc_uid)
|
||||
SearchVar(all_robolimbs)
|
||||
SearchVar(chargen_robolimbs)
|
||||
SearchVar(fabricator_robolimbs)
|
||||
SearchVar(basic_robolimb)
|
||||
SearchVar(moving_levels)
|
||||
SearchVar(cached_space)
|
||||
SearchVar(map_sectors)
|
||||
SearchVar(ship_engines)
|
||||
SearchVar(allfaxes)
|
||||
SearchVar(arrived_faxes)
|
||||
SearchVar(sent_faxes)
|
||||
SearchVar(alldepartments)
|
||||
SearchVar(admin_departments)
|
||||
SearchVar(photo_count)
|
||||
SearchVar(possible_cable_coil_colours)
|
||||
SearchVar(blacklisted_tesla_types)
|
||||
SearchVar(random_maps)
|
||||
SearchVar(map_count)
|
||||
SearchVar(supply_drop)
|
||||
SearchVar(maze_cell_count)
|
||||
SearchVar(lunchables_lunches_)
|
||||
SearchVar(lunchables_snacks_)
|
||||
SearchVar(lunchables_drinks_)
|
||||
SearchVar(lunchables_drink_reagents_)
|
||||
SearchVar(lunchables_alcohol_reagents_)
|
||||
SearchVar(message_servers)
|
||||
SearchVar(blackbox)
|
||||
SearchVar(responsive_carriers)
|
||||
SearchVar(finds_as_strings)
|
||||
SearchVar(ascii_A)
|
||||
SearchVar(ascii_Z)
|
||||
SearchVar(ascii_a)
|
||||
SearchVar(ascii_z)
|
||||
SearchVar(ascii_DOLLAR)
|
||||
SearchVar(ascii_ZERO)
|
||||
SearchVar(ascii_NINE)
|
||||
SearchVar(ascii_UNDERSCORE)
|
||||
SearchVar(OOP_OR)
|
||||
SearchVar(OOP_AND)
|
||||
SearchVar(OOP_BIT)
|
||||
SearchVar(OOP_EQUAL)
|
||||
SearchVar(OOP_COMPARE)
|
||||
SearchVar(OOP_ADD)
|
||||
SearchVar(OOP_MULTIPLY)
|
||||
SearchVar(OOP_POW)
|
||||
SearchVar(OOP_UNARY)
|
||||
SearchVar(OOP_GROUP)
|
||||
SearchVar(KW_FAIL)
|
||||
SearchVar(KW_PASS)
|
||||
SearchVar(KW_ERR)
|
||||
SearchVar(KW_WARN)
|
||||
SearchVar(maint_all_access)
|
||||
SearchVar(spells)
|
||||
SearchVar(artefact_feedback)
|
||||
SearchVar(GPS_list)
|
||||
SearchVar(gps_by_type)
|
||||
SearchVar(ventcrawl_machinery)
|
||||
SearchVar(can_enter_vent_with)
|
||||
SearchVar(ALL_ANTIGENS)
|
||||
SearchVar(all_unit_tests_passed)
|
||||
SearchVar(unit_tests_failures)
|
||||
SearchVar(total_unit_tests)
|
||||
SearchVar(ascii_esc)
|
||||
SearchVar(ascii_red)
|
||||
SearchVar(ascii_green)
|
||||
SearchVar(ascii_reset)
|
||||
SearchVar(assigned)
|
||||
SearchVar(created)
|
||||
SearchVar(merged)
|
||||
SearchVar(invalid_zone)
|
||||
SearchVar(air_blocked)
|
||||
SearchVar(zone_blocked)
|
||||
SearchVar(blocked)
|
||||
SearchVar(mark)
|
||||
SearchVar(contamination_overlay)
|
||||
SearchVar(vsc)
|
||||
SearchVar(cable_list)
|
||||
datum_container.last_find_references = search_time
|
||||
var/list/vars_list = datum_container.vars
|
||||
|
||||
for(var/varname in vars_list)
|
||||
#ifndef FIND_REF_NO_CHECK_TICK
|
||||
CHECK_TICK
|
||||
#endif
|
||||
if (varname == "vars" || varname == "vis_locs") //Fun fact, vis_locs don't count for references
|
||||
continue
|
||||
var/variable = vars_list[varname]
|
||||
|
||||
if(variable == src)
|
||||
testing("Found [type] [text_ref(src)] in [datum_container.type]'s [text_ref(datum_container)] [varname] var. [container_name]")
|
||||
continue
|
||||
|
||||
if(islist(variable))
|
||||
search_var(variable, "[container_name] [text_ref(datum_container)] -> [varname] (list)", recursive_limit - 1, search_time)
|
||||
|
||||
else if(islist(potential_container))
|
||||
var/normal = IS_NORMAL_LIST(potential_container)
|
||||
var/list/potential_cache = potential_container
|
||||
for(var/element_in_list in potential_cache)
|
||||
#ifndef FIND_REF_NO_CHECK_TICK
|
||||
CHECK_TICK
|
||||
#endif
|
||||
// Check normal entries
|
||||
if(element_in_list == src)
|
||||
testing("Found [type] [text_ref(src)] in list [container_name]\[[element_in_list]\]")
|
||||
continue
|
||||
|
||||
var/assoc_val = null
|
||||
if(!isnum(element_in_list) && normal)
|
||||
assoc_val = potential_cache[element_in_list]
|
||||
// Check assoc entries
|
||||
if(assoc_val == src)
|
||||
testing("Found [type] [text_ref(src)] in list [container_name]\[[element_in_list]\]")
|
||||
continue
|
||||
|
||||
//We need to run both of these checks, since our object could be hiding in either of them
|
||||
// Check normal sublists
|
||||
if(islist(element_in_list))
|
||||
search_var(element_in_list, "[container_name] -> [element_in_list] (list)", recursive_limit - 1, search_time)
|
||||
// Check assoc sublists
|
||||
if(islist(assoc_val))
|
||||
search_var(potential_container[element_in_list], "[container_name]\[[element_in_list]\] -> [assoc_val] (list)", recursive_limit - 1, search_time)
|
||||
|
||||
/proc/qdel_and_find_ref_if_fail(datum/thing_to_qdel, force = FALSE)
|
||||
thing_to_qdel.qdel_and_find_ref_if_fail(force)
|
||||
|
||||
/datum/proc/qdel_and_find_ref_if_fail(force = FALSE)
|
||||
SSgarbage.reference_find_on_fail[text_ref(src)] = TRUE
|
||||
qdel(src, force)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -31,9 +31,13 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage
|
||||
// of the immortality qdel hints
|
||||
var/list/noforcerespect = list()
|
||||
|
||||
#ifdef TESTING
|
||||
#ifdef TESTING
|
||||
var/list/qdel_list = list() // list of all types that have been qdel()eted
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef REFERENCE_TRACKING
|
||||
var/list/reference_find_on_fail = list()
|
||||
#endif
|
||||
|
||||
/datum/controller/subsystem/garbage_collector/New()
|
||||
NEW_SS_GLOBAL(SSgarbage)
|
||||
@@ -86,9 +90,16 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage
|
||||
var/starttime = world.time
|
||||
var/starttimeofday = world.timeofday
|
||||
var/idex = 1
|
||||
#ifdef REFERENCE_TRACKING
|
||||
var/ref_searching = FALSE
|
||||
#endif
|
||||
while((queue.len - (idex - 1)) && starttime == world.time && starttimeofday == world.timeofday)
|
||||
if (MC_TICK_CHECK)
|
||||
break
|
||||
#ifdef REFERENCE_TRACKING
|
||||
if (ref_searching)
|
||||
break
|
||||
#endif
|
||||
var/refID = queue[idex]
|
||||
if (!refID)
|
||||
idex++
|
||||
@@ -101,8 +112,16 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage
|
||||
var/datum/A
|
||||
A = locate(refID)
|
||||
if (A && A.gcDestroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake
|
||||
#ifdef REFERENCE_TRACKING
|
||||
if(reference_find_on_fail[text_ref(D)])
|
||||
INVOKE_ASYNC(D, TYPE_PROC_REF(/datum, find_references))
|
||||
ref_searching = TRUE
|
||||
#ifdef GC_FAILURE_HARD_LOOKUP
|
||||
A.find_references()
|
||||
else
|
||||
INVOKE_ASYNC(D, TYPE_PROC_REF(/datum, find_references))
|
||||
ref_searching = TRUE
|
||||
#endif
|
||||
reference_find_on_fail -= text_ref(D)
|
||||
#endif
|
||||
|
||||
// Something's still referring to the qdel'd object. Kill it.
|
||||
@@ -117,6 +136,9 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage
|
||||
else
|
||||
++gcedlasttick
|
||||
++totalgcs
|
||||
#ifdef REFERENCE_TRACKING
|
||||
reference_find_on_fail -= text_ref(D)
|
||||
#endif
|
||||
|
||||
if (idex > 1)
|
||||
queue.Cut(1, idex)
|
||||
@@ -222,11 +244,16 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage
|
||||
SSgarbage.HardQueue(D)
|
||||
if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
|
||||
SSgarbage.HardDelete(D)
|
||||
if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion.
|
||||
if (QDEL_HINT_FINDREFERENCE)//qdel will, if REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion.
|
||||
SSgarbage.QueueForQueuing(D)
|
||||
#ifdef TESTING
|
||||
#ifdef REFERENCE_TRACKING
|
||||
D.find_references()
|
||||
#endif
|
||||
if (QDEL_HINT_IFFAIL_FINDREFERENCE) // qdel will, if REFERENCE_TRACKING is enabled and the object fails to collect, display all references to this object
|
||||
SSgarbage.QueueForQueuing(D)
|
||||
#ifdef REFERENCE_TRACKING
|
||||
SSgarbage.reference_find_on_fail[text_ref(D)] = TRUE
|
||||
#endif
|
||||
else
|
||||
if(!SSgarbage.noqdelhint["[D.type]"])
|
||||
SSgarbage.noqdelhint["[D.type]"] = "[D.type]"
|
||||
|
||||
@@ -43,13 +43,13 @@ var/datum/controller/subsystem/atoms/SSatoms
|
||||
if(atoms)
|
||||
created_atoms = list()
|
||||
count = atoms.len
|
||||
for(var/I in atoms)
|
||||
if(InitAtom(I, mapload_arg))
|
||||
atoms -= I
|
||||
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 in world)
|
||||
for(var/atom/A as anything in world)
|
||||
if(!A.initialized)
|
||||
InitAtom(A, mapload_arg)
|
||||
++count
|
||||
@@ -61,8 +61,10 @@ var/datum/controller/subsystem/atoms/SSatoms
|
||||
initialized = INITIALIZATION_INNEW_REGULAR
|
||||
|
||||
if(late_loaders.len)
|
||||
for(var/I in late_loaders)
|
||||
var/atom/A = I
|
||||
for(var/I in 1 to late_loaders.len)
|
||||
var/atom/A = late_loaders[I]
|
||||
if(QDELETED(A))
|
||||
continue
|
||||
A.LateInitialize()
|
||||
admin_notice(SPAN_DANGER("Late-initialized [late_loaders.len] atoms."), R_DEBUG)
|
||||
log_ss("atoms", "Late initialized [late_loaders.len] atoms")
|
||||
@@ -81,6 +83,7 @@ var/datum/controller/subsystem/atoms/SSatoms
|
||||
if(atoms)
|
||||
. = created_atoms + atoms
|
||||
created_atoms = null
|
||||
// Note this doesn't actually do anything because we didn't finish porting TG init :^)
|
||||
|
||||
/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments)
|
||||
var/the_type = A.type
|
||||
|
||||
@@ -145,6 +145,8 @@ if(Datum.isprocessing) {\
|
||||
/datum/controller/subsystem/machinery/proc/setup_atmos_machinery(list/machines)
|
||||
var/list/atmos_machines = list()
|
||||
for (var/obj/machinery/atmospherics/machine in machines)
|
||||
if(QDELETED(machine))
|
||||
continue
|
||||
atmos_machines += machine
|
||||
admin_notice(SPAN_DANGER("Initializing atmos machinery."), R_DEBUG)
|
||||
log_ss("machinery", "Initializing atmos machinery.")
|
||||
|
||||
@@ -129,12 +129,6 @@ var/datum/controller/subsystem/radio/SSradio
|
||||
if(frequency)
|
||||
frequency.remove_listener(device)
|
||||
|
||||
if(frequency.devices.len == 0)
|
||||
qdel(frequency)
|
||||
frequencies -= f_text
|
||||
|
||||
return 1
|
||||
|
||||
/datum/controller/subsystem/radio/proc/remove_object_all(obj/device)
|
||||
for(var/freq in frequencies)
|
||||
SSradio.remove_object(device, text2num(freq))
|
||||
|
||||
@@ -447,7 +447,7 @@
|
||||
SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(RECURSIVE_CONTENTS_HEARING_SENSITIVE), old_target)
|
||||
|
||||
if(old_target.important_recursive_contents[RECURSIVE_CONTENTS_AI_TARGETS])
|
||||
GRID_CELL_REMOVE(intersecting_cell.hearing_contents, old_target.important_recursive_contents[RECURSIVE_CONTENTS_AI_TARGETS])
|
||||
GRID_CELL_REMOVE(intersecting_cell.tgt_contents, old_target.important_recursive_contents[RECURSIVE_CONTENTS_AI_TARGETS])
|
||||
|
||||
SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(RECURSIVE_CONTENTS_AI_TARGETS), old_target)
|
||||
|
||||
@@ -465,6 +465,7 @@
|
||||
|
||||
GRID_CELL_REMOVE(input_cell.client_contents, to_remove)
|
||||
GRID_CELL_REMOVE(input_cell.hearing_contents, to_remove)
|
||||
GRID_CELL_REMOVE(input_cell.tgt_contents, to_remove)
|
||||
|
||||
///if shit goes south, this will find hanging references for qdeleting movables inside the spatial grid
|
||||
/datum/controller/subsystem/spatial_grid/proc/find_hanging_cell_refs_for_movable(atom/movable/to_remove, remove_from_cells = TRUE)
|
||||
@@ -484,7 +485,7 @@
|
||||
for(var/list/z_level_grid as anything in grids_by_z_level)
|
||||
for(var/list/cell_row as anything in z_level_grid)
|
||||
for(var/datum/spatial_grid_cell/cell as anything in cell_row)
|
||||
if(to_remove in (cell.hearing_contents | cell.client_contents))
|
||||
if(to_remove in (cell.hearing_contents | cell.client_contents | cell.tgt_contents))
|
||||
containing_cells += cell
|
||||
if(remove_from_cells)
|
||||
force_remove_from_cell(to_remove, cell)
|
||||
@@ -509,17 +510,21 @@
|
||||
/atom/proc/find_grid_statistics_for_z_level(insert_clients = 0)
|
||||
var/raw_clients = 0
|
||||
var/raw_hearables = 0
|
||||
var/raw_targets = 0
|
||||
|
||||
var/cells_with_clients = 0
|
||||
var/cells_with_hearables = 0
|
||||
var/cells_with_targets = 0
|
||||
|
||||
var/list/client_list = list()
|
||||
var/list/hearable_list = list()
|
||||
var/list/target_list = list()
|
||||
|
||||
var/total_cells = (world.maxx / SPATIAL_GRID_CELLSIZE) ** 2
|
||||
|
||||
var/average_clients_per_cell = 0
|
||||
var/average_hearables_per_cell = 0
|
||||
var/average_targets_per_cell = 0
|
||||
|
||||
var/hearable_min_x = (world.maxx / SPATIAL_GRID_CELLSIZE)
|
||||
var/hearable_max_x = 1
|
||||
@@ -533,6 +538,12 @@
|
||||
var/client_min_y = (world.maxy / SPATIAL_GRID_CELLSIZE)
|
||||
var/client_max_y = 1
|
||||
|
||||
var/target_min_x = (world.maxx / SPATIAL_GRID_CELLSIZE)
|
||||
var/target_max_x = 1
|
||||
|
||||
var/target_min_y = (world.maxy / SPATIAL_GRID_CELLSIZE)
|
||||
var/target_max_y = 1
|
||||
|
||||
var/list/inserted_clients = list()
|
||||
|
||||
if(insert_clients)
|
||||
@@ -546,7 +557,7 @@
|
||||
for(var/client_to_insert in 0 to insert_clients)
|
||||
var/turf/random_turf = pick(turfs)
|
||||
var/mob/fake_client = new()
|
||||
fake_client.important_recursive_contents = list(SPATIAL_GRID_CONTENTS_TYPE_HEARING = list(fake_client), SPATIAL_GRID_CONTENTS_TYPE_CLIENTS = list(fake_client))
|
||||
fake_client.important_recursive_contents = list(SPATIAL_GRID_CONTENTS_TYPE_HEARING = list(fake_client), SPATIAL_GRID_CONTENTS_TYPE_CLIENTS = list(fake_client), SPATIAL_GRID_CONTENTS_TYPE_TARGETS = list(fake_client))
|
||||
fake_client.forceMove(random_turf)
|
||||
inserted_clients += fake_client
|
||||
|
||||
@@ -555,9 +566,11 @@
|
||||
for(var/datum/spatial_grid_cell/cell as anything in all_z_level_cells)
|
||||
var/client_length = length(cell.client_contents)
|
||||
var/hearable_length = length(cell.hearing_contents)
|
||||
var/target_length = length(cell.tgt_contents)
|
||||
|
||||
raw_clients += client_length
|
||||
raw_hearables += hearable_length
|
||||
raw_targets += target_length
|
||||
|
||||
if(client_length)
|
||||
cells_with_clients++
|
||||
@@ -593,11 +606,30 @@
|
||||
if(cell.cell_y > hearable_max_y)
|
||||
hearable_max_y = cell.cell_y
|
||||
|
||||
if(target_length)
|
||||
cells_with_targets++
|
||||
|
||||
target_list += cell.tgt_contents
|
||||
|
||||
if(cell.cell_x < target_min_x)
|
||||
target_min_x = cell.cell_x
|
||||
|
||||
if(cell.cell_x > target_max_x)
|
||||
target_max_x = cell.cell_x
|
||||
|
||||
if(cell.cell_y < target_min_y)
|
||||
target_min_y = cell.cell_y
|
||||
|
||||
if(cell.cell_y > target_max_y)
|
||||
target_max_y = cell.cell_y
|
||||
|
||||
var/total_client_distance = 0
|
||||
var/total_hearable_distance = 0
|
||||
var/total_target_distance = 0
|
||||
|
||||
var/average_client_distance = 0
|
||||
var/average_hearable_distance = 0
|
||||
var/average_target_distance = 0
|
||||
|
||||
for(var/hearable in hearable_list)//n^2 btw
|
||||
for(var/other_hearable in hearable_list)
|
||||
@@ -611,24 +643,35 @@
|
||||
continue
|
||||
total_client_distance += get_dist(client, other_client)
|
||||
|
||||
for(var/target in target_list)
|
||||
for(var/other_target in target_list)
|
||||
if(target == other_target)
|
||||
continue
|
||||
total_target_distance += get_dist(target, other_target)
|
||||
|
||||
if(length(hearable_list))
|
||||
average_hearable_distance = total_hearable_distance / length(hearable_list)
|
||||
if(length(client_list))
|
||||
average_client_distance = total_client_distance / length(client_list)
|
||||
if(length(target_list))
|
||||
average_target_distance = total_target_distance / length(target_list)
|
||||
|
||||
average_clients_per_cell = raw_clients / total_cells
|
||||
average_hearables_per_cell = raw_hearables / total_cells
|
||||
average_targets_per_cell = raw_targets / total_cells
|
||||
|
||||
for(var/mob/inserted_client as anything in inserted_clients)
|
||||
qdel(inserted_client)
|
||||
|
||||
message_admins("on z level [z] there are [raw_clients] clients ([insert_clients] of whom are fakes inserted to random station turfs) \
|
||||
and [raw_hearables] hearables. all of whom are inside the bounding box given by \
|
||||
clients: ([client_min_x], [client_min_y]) x ([client_max_x], [client_max_y]) \
|
||||
and hearables: ([hearable_min_x], [hearable_min_y]) x ([hearable_max_x], [hearable_max_y]) \
|
||||
on average there are [average_clients_per_cell] clients per cell and [average_hearables_per_cell] hearables per cell. \
|
||||
[cells_with_clients] cells have clients and [cells_with_hearables] have hearables, \
|
||||
the average client distance is: [average_client_distance] and the average hearable_distance is [average_hearable_distance].")
|
||||
message_admins("on z level [z] there are [raw_clients] clients ([insert_clients] of whom are fakes inserted to random station turfs), \
|
||||
[raw_hearables] hearables, and [raw_targets] targets. all of whom are inside the bounding box given by \
|
||||
clients: ([client_min_x], [client_min_y]) x ([client_max_x], [client_max_y]), \
|
||||
hearables: ([hearable_min_x], [hearable_min_y]) x ([hearable_max_x], [hearable_max_y]), \
|
||||
and targets: ([target_min_x], [target_min_y]) x ([target_max_x], [target_max_y]). \
|
||||
on average there are [average_clients_per_cell] clients per cell, [average_hearables_per_cell] hearables per cell, and \
|
||||
[average_targets_per_cell] targets per cell. [cells_with_clients] cells have clients, [cells_with_hearables] have hearables, \
|
||||
and [cells_with_targets] have targets. the average client distance is: [average_client_distance], the average hearable_distance \
|
||||
is [average_hearable_distance], and the average target distance is [average_target_distance].")
|
||||
|
||||
#undef GRID_CELL_ADD
|
||||
#undef GRID_CELL_REMOVE
|
||||
|
||||
Reference in New Issue
Block a user