From d3c34a4a72be24f1d7e09c8c27503dfef52159a0 Mon Sep 17 00:00:00 2001 From: Par Winzell Date: Wed, 7 Dec 2011 22:39:28 +0000 Subject: [PATCH] Match the Java side's cleanup functionality. This also helps Flash garbage collect properly. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6752 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../com/threerings/presents/client/Client.as | 5 +++++ .../presents/client/ClientDObjectMgr.as | 21 +++++++++++++++++++ 2 files changed, 26 insertions(+) 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 {