Handle the situation where a referred object and the referring object are

both destroyed without any intervening event processing.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3186 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2004-10-28 21:59:00 +00:00
parent abc4e9c86a
commit dd1f895190
@@ -1,5 +1,5 @@
//
// $Id: PresentsDObjectMgr.java,v 1.47 2004/08/27 02:20:23 mdb Exp $
// $Id: PresentsDObjectMgr.java,v 1.48 2004/10/28 21:59:00 mdb Exp $
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
@@ -409,8 +409,8 @@ public class PresentsDObjectMgr
{
int oid = target.getOid();
// Log.info("Removing destroyed object from table " +
// "[oid=" + oid + "].");
// Log.info("Removing destroyed object from table " +
// "[oid=" + oid + "].");
// remove the object from the table
_objects.remove(oid);
@@ -435,7 +435,7 @@ public class PresentsDObjectMgr
// post an object removed event to clear the reference
postEvent(new ObjectRemovedEvent(
ref.reffingOid, ref.field, oid));
// Log.info("Forcing removal " + ref + ".");
// Log.info("Forcing removal " + ref + ".");
} else {
Log.info("Dangling reference from inactive object " +
@@ -501,14 +501,20 @@ public class PresentsDObjectMgr
}
}
if (ref == null) {
// if a referred object and referring object are both destroyed without
// allowing the referred object destruction to process the ObjectRemoved
// event which is auto-generated, the subsequent destruction of the
// referring object will attempt to clear the reference to the referred
// object which no longer exists; so we don't complain about non-
// existent references if the referree is already destroyed
if (ref == null && _objects.containsKey(reffedOid)) {
Log.warning("Requested to clear out non-existent reference " +
"[refferOid=" + reffer.getOid() +
", field=" + field +
", reffedOid=" + reffedOid + "].");
// } else {
// Log.info("Cleared out reference " + ref + ".");
// } else {
// Log.info("Cleared out reference " + ref + ".");
}
}
@@ -565,7 +571,7 @@ public class PresentsDObjectMgr
// finally add the reference
refs[rpos] = ref;
// Log.info("Tracked reference " + ref + ".");
// Log.info("Tracked reference " + ref + ".");
return true;
}
@@ -583,6 +589,9 @@ public class PresentsDObjectMgr
int toid = target.getOid();
int oid = ore.getOid();
// Log.info("Processing object removed [from=" + toid +
// ", roid=" + toid + "].");
// get the reference vector for the referenced object
Reference[] refs = (Reference[])_refs.get(oid);
if (refs == null) {
@@ -591,9 +600,9 @@ public class PresentsDObjectMgr
// generate object removed events for all of its referencees.
// so we opt not to log anything in this case
// Log.warning("Object removed without reference to track it " +
// "[toid=" + toid + ", field=" + field +
// ", oid=" + oid + "].");
// Log.info("Object removed without reference to track it " +
// "[toid=" + toid + ", field=" + field +
// ", oid=" + oid + "].");
return true;
}
@@ -601,7 +610,7 @@ public class PresentsDObjectMgr
for (int i = 0; i < refs.length; i++) {
Reference ref = refs[i];
if (ref != null && ref.equals(toid, field)) {
// Log.info("Removed reference " + refs[i] + ".");
// Log.info("Removed reference " + refs[i] + ".");
refs[i] = null;
return true;
}