diff --git a/src/java/com/threerings/presents/client/Client.java b/src/java/com/threerings/presents/client/Client.java index d1edd1807..a8d1b000c 100644 --- a/src/java/com/threerings/presents/client/Client.java +++ b/src/java/com/threerings/presents/client/Client.java @@ -666,6 +666,11 @@ public class Client // ensure that it won't happen until CLIENT_DID_LOGOFF was dispatched _runQueue.postRunnable(new Runnable() { public void run () { + // tell the object manager that we're no longer connected to the server + if (_omgr instanceof ClientDObjectMgr) { + ((ClientDObjectMgr)_omgr).cleanup(); + } + // clear out our references _comm = null; _omgr = null; diff --git a/src/java/com/threerings/presents/client/ClientDObjectMgr.java b/src/java/com/threerings/presents/client/ClientDObjectMgr.java index 1fe6f61ac..4e334ebe1 100644 --- a/src/java/com/threerings/presents/client/ClientDObjectMgr.java +++ b/src/java/com/threerings/presents/client/ClientDObjectMgr.java @@ -185,6 +185,20 @@ public class ClientDObjectMgr } } + /** + * Called when the client is cleaned up due to having disconnected from the server. + */ + public void cleanup () + { + // tell any pending object subscribers that they're not getting their bits + for (PendingRequest req : _penders.values()) { + for (Subscriber sub : req.targets) { + sub.requestFailed(req.oid, new ObjectAccessException("Client connection closed")); + } + } + _penders.clear(); + } + protected void queueAction ( int oid, Subscriber target, boolean subscribe) {