From d76d4e89ff3e3dc94444c06dae7ec800c60e8a02 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Thu, 22 May 2003 17:23:53 +0000 Subject: [PATCH] Make it possible to have a distributed object destroyed when its last subscriber is removed. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2602 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../presents/client/ClientDObjectMgr.java | 4 ++-- .../com/threerings/presents/dobj/DObject.java | 17 +++++++++++++++-- .../presents/dobj/DObjectManager.java | 4 ++-- .../presents/server/PresentsDObjectMgr.java | 9 ++++++--- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/java/com/threerings/presents/client/ClientDObjectMgr.java b/src/java/com/threerings/presents/client/ClientDObjectMgr.java index ea10b5b8c..e94040e00 100644 --- a/src/java/com/threerings/presents/client/ClientDObjectMgr.java +++ b/src/java/com/threerings/presents/client/ClientDObjectMgr.java @@ -1,5 +1,5 @@ // -// $Id: ClientDObjectMgr.java,v 1.23 2003/04/10 17:48:42 mdb Exp $ +// $Id: ClientDObjectMgr.java,v 1.24 2003/05/22 17:23:53 mdb Exp $ package com.threerings.presents.client; @@ -106,7 +106,7 @@ public class ClientDObjectMgr } // inherit documentation from the interface - public void removedLastSubscriber (DObject obj) + public void removedLastSubscriber (DObject obj, boolean deathWish) { // if this object has a registered flush delay, don't can it just // yet, just slip it onto the flush queue diff --git a/src/java/com/threerings/presents/dobj/DObject.java b/src/java/com/threerings/presents/dobj/DObject.java index 55823435e..58df1fc53 100644 --- a/src/java/com/threerings/presents/dobj/DObject.java +++ b/src/java/com/threerings/presents/dobj/DObject.java @@ -1,5 +1,5 @@ // -// $Id: DObject.java,v 1.63 2003/04/30 22:32:04 mdb Exp $ +// $Id: DObject.java,v 1.64 2003/05/22 17:23:53 mdb Exp $ package com.threerings.presents.dobj; @@ -151,11 +151,20 @@ public class DObject implements Streamable // that we're still active otherwise there's no need to notify // our objmgr because we don't have one if (--_scount == 0 && _omgr != null) { - _omgr.removedLastSubscriber(this); + _omgr.removedLastSubscriber(this, _deathWish); } } } + /** + * Instructs this object to request to have a fork stuck in it when + * its last subscriber is removed. + */ + public void setDestroyOnLastSubscriberRemoved (boolean deathWish) + { + _deathWish = deathWish; + } + /** * Adds an event listener to this object. The listener will be * notified when any events are dispatched on this object that match @@ -872,4 +881,8 @@ public class DObject implements Streamable /** Whether or not our nested transaction has been cancelled. */ protected transient boolean _tcancelled; + + /** Indicates whether we want to be destroyed when our last subscriber + * is removed. */ + protected transient boolean _deathWish = false; } diff --git a/src/java/com/threerings/presents/dobj/DObjectManager.java b/src/java/com/threerings/presents/dobj/DObjectManager.java index 87136b1d3..de36b9edd 100644 --- a/src/java/com/threerings/presents/dobj/DObjectManager.java +++ b/src/java/com/threerings/presents/dobj/DObjectManager.java @@ -1,5 +1,5 @@ // -// $Id: DObjectManager.java,v 1.11 2003/03/10 18:29:54 mdb Exp $ +// $Id: DObjectManager.java,v 1.12 2003/05/22 17:23:53 mdb Exp $ package com.threerings.presents.dobj; @@ -95,5 +95,5 @@ public interface DObjectManager * then choose to flush this object from the system or unregister from * some upstream manager whose object it was proxying, for example. */ - public void removedLastSubscriber (DObject obj); + public void removedLastSubscriber (DObject obj, boolean deathWish); } diff --git a/src/java/com/threerings/presents/server/PresentsDObjectMgr.java b/src/java/com/threerings/presents/server/PresentsDObjectMgr.java index cd98b2946..42b879bcc 100644 --- a/src/java/com/threerings/presents/server/PresentsDObjectMgr.java +++ b/src/java/com/threerings/presents/server/PresentsDObjectMgr.java @@ -1,5 +1,5 @@ // -// $Id: PresentsDObjectMgr.java,v 1.31 2003/04/10 17:48:42 mdb Exp $ +// $Id: PresentsDObjectMgr.java,v 1.32 2003/05/22 17:23:53 mdb Exp $ package com.threerings.presents.server; @@ -105,9 +105,12 @@ public class PresentsDObjectMgr } // inherit documentation from the interface - public void removedLastSubscriber (DObject obj) + public void removedLastSubscriber (DObject obj, boolean deathWish) { - // nothing to do here, our objects live forever! + // destroy the object if it so desires + if (deathWish) { + destroyObject(obj.getOid()); + } } /**