diff --git a/src/java/com/threerings/presents/dobj/DObject.java b/src/java/com/threerings/presents/dobj/DObject.java index 5e8144731..c86bdc455 100644 --- a/src/java/com/threerings/presents/dobj/DObject.java +++ b/src/java/com/threerings/presents/dobj/DObject.java @@ -866,8 +866,10 @@ public class DObject extends TrackedObject // if we're on the authoritative server, we update the set immediately DSet.Entry oldEntry = null; if (_omgr != null && _omgr.isManager(this)) { - oldEntry = set.get(key); - set.removeKey(key); + oldEntry = set.removeKey(key); + if (oldEntry == null) { + Thread.dumpStack(); + } } // dispatch an entry removed event postEvent(new EntryRemovedEvent(_oid, name, key, oldEntry)); @@ -881,8 +883,10 @@ public class DObject extends TrackedObject // if we're on the authoritative server, we update the set immediately DSet.Entry oldEntry = null; if (_omgr != null && _omgr.isManager(this)) { - oldEntry = set.get(entry.getKey()); - set.update(entry); + oldEntry = set.update(entry); + if (oldEntry == null) { + Thread.dumpStack(); + } } // dispatch an entry updated event postEvent(new EntryUpdatedEvent(_oid, name, entry, oldEntry)); diff --git a/src/java/com/threerings/presents/dobj/DSet.java b/src/java/com/threerings/presents/dobj/DSet.java index 17d546440..a15683c40 100644 --- a/src/java/com/threerings/presents/dobj/DSet.java +++ b/src/java/com/threerings/presents/dobj/DSet.java @@ -295,7 +295,7 @@ public class DSet */ protected boolean remove (Entry elem) { - return removeKey(elem.getKey()); + return (null != removeKey(elem.getKey())); } /** @@ -304,10 +304,10 @@ public class DSet * removeFrom{Set}() method should be called on the * distributed object that contains the set in question. * - * @return true if a matching entry was removed, false if no entry - * in the set matched the key. + * @return the old matching entry if found and removed, null if not + * found. */ - protected boolean removeKey (Object key) + protected Entry removeKey (Object key) { // look up this entry's position in our set int eidx = ArrayUtil.binarySearch( @@ -316,13 +316,14 @@ public class DSet // if we found it, remove it if (eidx >= 0) { // shift the remaining elements down + Entry oldEntry = _entries[eidx]; System.arraycopy(_entries, eidx+1, _entries, eidx, _size-eidx-1); _entries[--_size] = null; _modCount++; - return true; + return oldEntry; } else { - return false; + return null; } } @@ -333,10 +334,10 @@ public class DSet * update{Set}() method should be called on the * distributed object that contains the set in question. * - * @return true if the entry was updated, false if it was not - * already in the set (in which case nothing is updated). + * @return the old entry that was replaced, or null if it was not + * found (in which case nothing is updated). */ - protected boolean update (Entry elem) + protected Entry update (Entry elem) { // look up this entry's position in our set int eidx = ArrayUtil.binarySearch( @@ -344,11 +345,12 @@ public class DSet // if we found it, update it if (eidx >= 0) { + Entry oldEntry = _entries[eidx]; _entries[eidx] = elem; _modCount++; - return true; + return oldEntry; } else { - return false; + return null; } } diff --git a/src/java/com/threerings/presents/dobj/EntryAddedEvent.java b/src/java/com/threerings/presents/dobj/EntryAddedEvent.java index 6190cff49..26eed49d7 100644 --- a/src/java/com/threerings/presents/dobj/EntryAddedEvent.java +++ b/src/java/com/threerings/presents/dobj/EntryAddedEvent.java @@ -84,7 +84,10 @@ public class EntryAddedEvent extends NamedEvent throws ObjectAccessException { if (!_alreadyApplied) { - ((DSet)target.getAttribute(_name)).add(_entry); + boolean added = ((DSet)target.getAttribute(_name)).add(_entry); + if (!added) { + Log.warning("Duplicate entry found [event=" + this + "]."); + } } return true; } diff --git a/src/java/com/threerings/presents/dobj/EntryRemovedEvent.java b/src/java/com/threerings/presents/dobj/EntryRemovedEvent.java index c735622f6..bb2466078 100644 --- a/src/java/com/threerings/presents/dobj/EntryRemovedEvent.java +++ b/src/java/com/threerings/presents/dobj/EntryRemovedEvent.java @@ -1,5 +1,5 @@ // -// $Id: EntryRemovedEvent.java,v 1.17 2004/08/27 02:20:20 mdb Exp $ +// $Id$ // // Narya library - tools for developing networked games // Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved @@ -21,6 +21,8 @@ package com.threerings.presents.dobj; +import com.threerings.presents.Log; + /** * An entry removed event is dispatched when an entry is removed from a * {@link DSet} attribute of a distributed object. It can also be @@ -82,10 +84,14 @@ public class EntryRemovedEvent extends NamedEvent { if (_oldEntry == UNSET_OLD_ENTRY) { DSet set = (DSet)target.getAttribute(_name); - // fetch the previous value for interested callers - _oldEntry = set.get(_key); - // remove it from the set - set.removeKey(_key); + // remove, fetch the previous value for interested callers + _oldEntry = set.removeKey(_key); + if (_oldEntry == null) { + // complain if there was actually nothing there + Log.warning("No matching entry to remove [key=" + _key + + ", set=" + set + "]."); + return false; + } } return true; } diff --git a/src/java/com/threerings/presents/dobj/EntryUpdatedEvent.java b/src/java/com/threerings/presents/dobj/EntryUpdatedEvent.java index 401a76527..35f5561e7 100644 --- a/src/java/com/threerings/presents/dobj/EntryUpdatedEvent.java +++ b/src/java/com/threerings/presents/dobj/EntryUpdatedEvent.java @@ -1,5 +1,5 @@ // -// $Id: EntryUpdatedEvent.java,v 1.13 2004/08/27 02:20:20 mdb Exp $ +// $Id$ // // Narya library - tools for developing networked games // Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved @@ -87,10 +87,8 @@ public class EntryUpdatedEvent extends NamedEvent if (_oldEntry == UNSET_OLD_ENTRY) { DSet set = (DSet)target.getAttribute(_name); // fetch the previous value for interested callers - _oldEntry = set.get(_entry.getKey()); - - // update the entry - if (!set.update(_entry)) { + _oldEntry = set.update(_entry); + if (_oldEntry == null) { // complain if we didn't update anything Log.warning("No matching entry to update [entry=" + this + ", set=" + set + "].");