From e9f3cb9b9abf2cd61fd51fd84bfaedd9760e761b Mon Sep 17 00:00:00 2001 From: Charlie Groves Date: Fri, 29 Jul 2011 06:39:20 +0000 Subject: [PATCH] Still subscribe if the DObject is local when proxying a remote object to preserve the behavior of DObject.setDestroyOnLastSubscriberRemoved on the proxied object git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6687 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../presents/peer/server/PeerManager.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/threerings/presents/peer/server/PeerManager.java b/src/main/java/com/threerings/presents/peer/server/PeerManager.java index cded01364..5abcf9d6f 100644 --- a/src/main/java/com/threerings/presents/peer/server/PeerManager.java +++ b/src/main/java/com/threerings/presents/peer/server/PeerManager.java @@ -569,10 +569,17 @@ public abstract class PeerManager final DObjectAddress remote, final ResultListener listener) { if (remote.nodeName.equals(_nodeName)) { - _omgr.postRunnable(new Runnable() { - public void run () { + // Still subscribe if the DObject is local to preserve the behavior of + // DObject.setDestroyOnLastSubscriberRemoved on the proxied object + _omgr.subscribeToObject(remote.oid, new Subscriber() { + public void objectAvailable (T object) { + _proxies.put(remote, new Tuple, DObject>(this, object)); listener.requestCompleted(remote.oid); } + + public void requestFailed(int oid, ObjectAccessException oae) { + listener.requestFailed(oae); + } }); return; } @@ -618,6 +625,13 @@ public abstract class PeerManager return; } + // If it's local, just remove the subscriber we added and bail + if (key.nodeName.equals(_nodeName)) { + bits.right.removeSubscriber(bits.left); + return; + } + + // clear out the local object manager's proxy mapping _omgr.clearProxyObject(remoteOid, bits.right);