diff --git a/src/main/as/com/threerings/presents/client/Client.as b/src/main/as/com/threerings/presents/client/Client.as index 181356af6..5e91a78c4 100644 --- a/src/main/as/com/threerings/presents/client/Client.as +++ b/src/main/as/com/threerings/presents/client/Client.as @@ -537,6 +537,11 @@ public class Client extends EventDispatcher internal function cleanup (logonError :Error) :void { + // tell the object manager that we're no longer connected to the server + if (_omgr is ClientDObjectMgr) { + ClientDObjectMgr(_omgr).cleanup(); + } + // clear out our references _comm = null; _bstrap = null; diff --git a/src/main/as/com/threerings/presents/client/ClientDObjectMgr.as b/src/main/as/com/threerings/presents/client/ClientDObjectMgr.as index 1bffcdf46..3588350ed 100644 --- a/src/main/as/com/threerings/presents/client/ClientDObjectMgr.as +++ b/src/main/as/com/threerings/presents/client/ClientDObjectMgr.as @@ -80,6 +80,27 @@ public class ClientDObjectMgr _flushInterval.start(); } + /** + * Called when the client is cleaned up due to having disconnected from the server. + */ + public function cleanup () :void + { + // tell any pending object subscribers that they're not getting their bits + for each (var req :PendingRequest in _penders.values()) { + for each (var sub :Subscriber in req.targets) { + sub.requestFailed(req.oid, new ObjectAccessError("Client connection closed")); + } + } + _penders.clear(); + _flushes.clear(); + _dead.clear(); + _ocache.clear(); + + _flushInterval.stop(); + _flushInterval.removeEventListener(TimerEvent.TIMER, flushObjects); + _flushInterval = null; + } + // documentation inherited from interface DObjectManager public function isManager (object :DObject) :Boolean {