From ac62348afcf579eeed6a964d5f03f682191bafd4 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Wed, 24 Oct 2001 00:57:39 +0000 Subject: [PATCH] Modified shutdown handling such that the place manager now listens for place object death and lets the place registry know to unmap it during its shutdown process. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@544 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../threerings/crowd/server/PlaceManager.java | 45 ++++++++++++++----- .../crowd/server/PlaceRegistry.java | 43 +++++------------- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/src/java/com/threerings/crowd/server/PlaceManager.java b/src/java/com/threerings/crowd/server/PlaceManager.java index 1080e61b9..f907aff26 100644 --- a/src/java/com/threerings/crowd/server/PlaceManager.java +++ b/src/java/com/threerings/crowd/server/PlaceManager.java @@ -1,12 +1,16 @@ // -// $Id: PlaceManager.java,v 1.20 2001/10/24 00:38:01 mdb Exp $ +// $Id: PlaceManager.java,v 1.21 2001/10/24 00:57:39 mdb Exp $ package com.threerings.crowd.server; import java.util.HashMap; import java.util.Properties; -import com.threerings.presents.dobj.*; +import com.threerings.presents.dobj.MessageListener; +import com.threerings.presents.dobj.MessageEvent; +import com.threerings.presents.dobj.OidListListener; +import com.threerings.presents.dobj.ObjectAddedEvent; +import com.threerings.presents.dobj.ObjectRemovedEvent; import com.threerings.crowd.Log; import com.threerings.crowd.data.*; @@ -26,9 +30,9 @@ import com.threerings.crowd.data.*; * basis for place-based access control. * *

A derived class is expected to handle initialization, cleanup and - * operational functionality via the calldown functions {@link - * #didStartup}, {@link #willShutdown}, and {@link #didShutdown} as well - * as through event listeners. + * operational functionality via the calldown functions {@link #didInit}, + * {@link #didStartup}, and {@link #didShutdown} as well as through event + * listeners. */ public class PlaceManager implements MessageListener, OidListListener @@ -119,14 +123,22 @@ public class PlaceManager { } - // not called at present but will eventually be part of the shutdown - // and cleanup process - protected void willShutdown () + /** + * Causes the place object being managed by this place manager to be + * destroyed and the place manager to shut down. + */ + public void shutdown () { + // destroy the object and everything will follow from that + CrowdServer.omgr.destroyObject(_plobj.getOid()); } - // not called at present but will eventually be part of the shutdown - // and cleanup process + /** + * Called when this place has been destroyed and the place manager has + * shut down (via a call to {@link #shutdown}). Derived classes can + * override this method and perform any necessary shutdown time + * processing. + */ protected void didShutdown () { } @@ -282,6 +294,19 @@ public class PlaceManager } } + /** + * Handles place destruction. We shut ourselves down and ask the place + * registry to unmap us. + */ + public void objectDestroyed (ObjectDestroyedEvent event) + { + // unregister ourselves + _registry.unmapPlaceManager(this); + + // let our derived classes shut themselves down + didShutdown(); + } + /** * Generates a string representation of this manager. Does so in a way * that makes it easier for derived classes to add to the string diff --git a/src/java/com/threerings/crowd/server/PlaceRegistry.java b/src/java/com/threerings/crowd/server/PlaceRegistry.java index 8bf290618..1881ee5cd 100644 --- a/src/java/com/threerings/crowd/server/PlaceRegistry.java +++ b/src/java/com/threerings/crowd/server/PlaceRegistry.java @@ -1,5 +1,5 @@ // -// $Id: PlaceRegistry.java,v 1.14 2001/10/24 00:37:24 mdb Exp $ +// $Id: PlaceRegistry.java,v 1.15 2001/10/24 00:57:39 mdb Exp $ package com.threerings.crowd.server; @@ -12,8 +12,6 @@ import com.samskivert.util.Queue; import com.threerings.presents.dobj.DObject; import com.threerings.presents.dobj.ObjectAccessException; -import com.threerings.presents.dobj.ObjectDeathListener; -import com.threerings.presents.dobj.ObjectDestroyedEvent; import com.threerings.presents.dobj.Subscriber; import com.threerings.crowd.Log; @@ -27,7 +25,7 @@ import com.threerings.crowd.data.PlaceObject; * places. */ public class PlaceRegistry - implements Subscriber, ObjectDeathListener + implements Subscriber { /** * Used to receive a callback when the place object associated with a @@ -170,10 +168,6 @@ public class PlaceRegistry CreationObserver observer = (CreationObserver)tuple.right; PlaceObject plobj = (PlaceObject)object; - // add ourselves as a destruction listener so that we can clean up - // after the place manager when it goes away - plobj.addListener(this); - // stick the manager into our table _pmgrs.put(plobj.getOid(), pmgr); @@ -203,33 +197,18 @@ public class PlaceRegistry ", cause=" + cause + "]."); } - // documentation inherited - public void objectDestroyed (ObjectDestroyedEvent event) - { - // the place object went away, so we unmap our place manager - int placeOid = event.getTargetOid(); - PlaceManager pmgr = (PlaceManager)_pmgrs.remove(placeOid); - if (pmgr == null) { - Log.warning("Heard about destruction of object for which " + - "no place manager was registered? " + - "[oid=" + placeOid + "]."); - } else { - // let our derived classes know what's up - placeWasDestroyed(pmgr); - } - } - /** - * Called when the place registry has unmapped a place manager because - * its associated place object was destroyed. Derived classes may wish - * to override this method if they are interested in place (and place - * manager) destruction. - * - * @param pmgr a reference to the place manager that was managing the - * destroyed place. + * Called by the place manager when it has been shut down. */ - protected void placeWasDestroyed (PlaceManager pmgr) + protected void unmapPlaceManager (PlaceManager pmgr) { + // remove it from the table + if (_pmgrs.remove(pmgr.getPlaceObject().getOid()) == null) { + Log.warning("Requested to unmap unmapped place manager " + + "[pmgr=" + pmgr + "]."); + } else { + Log.info("Unmapped place manager " + pmgr + "."); + } } /** A queue of place managers waiting for their place objects. */