From 93318a5345ffb0d5229e1c55840bec6b4a257149 Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 15 Jun 2017 17:13:59 -0400 Subject: [PATCH] Fixes players not being removed from the manifest immediately when cryoing. * The cryopod simply qdel's the datacore records. Old garbage.dm hard-del()'d datums, so it was fine. Now we need to make sure they are actually removed from the data_core. * Testing shows this fixes #1713 and in most cases the objects also GC cleanly. However some older computers still retain hard references to data_core entries. But even in the cases where that prevents a clean GC, the player is still removed from the manifest successfully and promptly, so that can wait. --- code/_helpers/logging.dm | 4 +- code/datums/mixed.dm | 81 +++++++++++++++++++++++----------------- 2 files changed, 50 insertions(+), 35 deletions(-) diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 57813b01132..c58b2d13817 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -180,6 +180,8 @@ return "[..()] ([ckey])" /proc/log_info_line(var/datum/d) + if(!d) + return "*null*" if(!istype(d)) - return + return json_encode(d) return d.log_info_line() diff --git a/code/datums/mixed.dm b/code/datums/mixed.dm index f0f0c70abda..ab53596d8cc 100644 --- a/code/datums/mixed.dm +++ b/code/datums/mixed.dm @@ -1,34 +1,47 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/datum/data - var/name = "data" - var/size = 1.0 - - -/datum/data/function - name = "function" - size = 2.0 - - -/datum/data/function/data_control - name = "data control" - - -/datum/data/function/id_changer - name = "id changer" - - -/datum/data/record - name = "record" - size = 5.0 - var/list/fields = list( ) - - -/datum/data/text - name = "text" - var/data = null - - - -/datum/debug - var/list/debuglist +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 + +/datum/data + var/name = "data" + var/size = 1.0 + + +/datum/data/function + name = "function" + size = 2.0 + + +/datum/data/function/data_control + name = "data control" + + +/datum/data/function/id_changer + name = "id changer" + + +/datum/data/record + name = "record" + size = 5.0 + var/list/fields = list( ) + +// Mostly used for data_core records, but unfortuantely used some other places too. But mostly here, so lets make a good effort. +// TODO - Some machines/computers might be holding references to us. Lets look into that, but at least for now lets make sure that the manifest is cleaned up. +/datum/data/record/Destroy(var/force) + if(data_core.locked.Find(src)) + if(!force) + crash_with("Someone tried to qdel a record that was in data_core.locked [log_info_line(src)]") + return QDEL_HINT_LETMELIVE + data_core.locked -= src + data_core.medical -= src + data_core.general -= src + data_core.security -= src + ..() + return QDEL_HINT_FINDREFERENCE // If we must, we can resort to QDEL_HINT_HARDDEL. But lets see how this works in practice ~Leshana + +/datum/data/text + name = "text" + var/data = null + + + +/datum/debug + var/list/debuglist