From 7c305305b784a457f4c6c0733c9382abae0b826c Mon Sep 17 00:00:00 2001 From: MrPerson Date: Sat, 14 Mar 2015 16:52:49 -0700 Subject: [PATCH] Fix reagent garbage collection hopefully I say hopefully because stuff that collects successfully locally likes to fail on sybil. --- .../effects/effect_system/effect_system.dm | 3 +-- code/modules/events/vent_clog.dm | 2 +- code/modules/projectiles/firing.dm | 3 +-- code/modules/reagents/Chemistry-Holder.dm | 17 ++++++++++------- .../Chemistry-Reagents/Chemistry-Reagents.dm | 4 ++++ code/modules/research/experimentor.dm | 6 +++--- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index f085bf60e04..9f3662ae8ed 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -16,8 +16,7 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/proc/delete() loc = null if(reagents) - reagents.delete() - return + qdel(reagents) /datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16) if(A.alpha == 0) //Handle already transparent case diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 037b2f4101f..7703be7fc73 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -37,4 +37,4 @@ smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1) playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() - R.delete() //GC the reagents \ No newline at end of file + qdel(R) \ No newline at end of file diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index c5f2b3a0e7d..d130f56e32b 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -25,8 +25,7 @@ if(reagents && BB.reagents) reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets - reagents.delete() - return + qdel(reagents) /obj/item/ammo_casing/proc/throw_proj(var/turf/targloc, mob/living/user as mob|obj, params) var/turf/curloc = user.loc diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 6041066d737..aa5559afc44 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -51,6 +51,15 @@ datum/reagents/New(maximum=100) chemical_reactions_list[id] += D break // Don't bother adding ourselves to other reagent ids, it is redundant. +datum/reagents/Destroy() + ..() + for(var/datum/reagent/R in reagent_list) + qdel(R) + reagent_list.Cut() + reagent_list = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null + datum/reagents/proc/remove_any(var/amount=1) var/total_transfered = 0 var/current_list_element = 1 @@ -532,12 +541,6 @@ datum/reagents/proc/remove_all_type(var/reagent_type, var/amount, var/strict = 0 return has_removed_reagent -datum/reagents/proc/delete() - for(var/datum/reagent/R in reagent_list) - R.holder = null - if(my_atom) - my_atom.reagents = null - //two helper functions to preserve data across reactions (needed for xenoarch) datum/reagents/proc/get_data(var/reagent_id) for(var/datum/reagent/D in reagent_list) @@ -578,6 +581,6 @@ datum/reagents/proc/copy_data(var/datum/reagent/current_reagent) // Max vol is maximum volume of holder atom/proc/create_reagents(var/max_vol) if(reagents) - reagents.delete() + qdel(reagents) reagents = new/datum/reagents(max_vol) reagents.my_atom = src diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm index 79a43aa5d05..281fa02e567 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm @@ -30,6 +30,10 @@ datum/reagent var/addiction_stage = 0 var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick. +datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references + ..() + holder = null + datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some if(!istype(M, /mob/living)) return 0 diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index f61f7a59e99..367199b7a9d 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -325,7 +325,7 @@ smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() - R.delete() + qdel(R) ejectItem(TRUE) if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) visible_message("[src]'s chemical chamber has sprung a leak!") @@ -337,7 +337,7 @@ smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() - R.delete() + qdel(R) ejectItem(TRUE) warn_admins(usr, "[chosenchem] smoke") investigate_log("Experimentor has released [chosenchem] smoke!", "experimentor") @@ -424,7 +424,7 @@ smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() - R.delete() + qdel(R) ejectItem(TRUE) if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message("[src] malfunctions, shattering [exp_on] and leaking cold air!.")