diff options
author | Benoit Foucher <benoit@zeroc.com> | 2008-03-21 12:59:03 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2008-03-21 12:59:03 +0100 |
commit | 7971802906584415f7eefe7cabe8aadbbec9d7d1 (patch) | |
tree | 10065f4982766e346d5e52b5b21e28ff6d708a2d /java/src/Ice/ObjectPrxHelperBase.java | |
parent | Fixed dependency for mulicastC on multicastS (diff) | |
download | ice-7971802906584415f7eefe7cabe8aadbbec9d7d1.tar.bz2 ice-7971802906584415f7eefe7cabe8aadbbec9d7d1.tar.xz ice-7971802906584415f7eefe7cabe8aadbbec9d7d1.zip |
Fixed bug 2867
Diffstat (limited to 'java/src/Ice/ObjectPrxHelperBase.java')
-rw-r--r-- | java/src/Ice/ObjectPrxHelperBase.java | 89 |
1 files changed, 48 insertions, 41 deletions
diff --git a/java/src/Ice/ObjectPrxHelperBase.java b/java/src/Ice/ObjectPrxHelperBase.java index 0b4bdbb048f..dec72e1178e 100644 --- a/java/src/Ice/ObjectPrxHelperBase.java +++ b/java/src/Ice/ObjectPrxHelperBase.java @@ -814,7 +814,7 @@ public class ObjectPrxHelperBase implements ObjectPrx // // The _delegate attribute is only used if "cache connection" // is enabled. If it's not enabled, we don't keep track of the - // delegate -- a new delegate is created for each invocations. + // delegate -- a new delegate is created for each invocation. // if(delegateD != null) @@ -931,60 +931,48 @@ public class ObjectPrxHelperBase implements ObjectPrx } } - public final synchronized _ObjectDel - __getDelegate(boolean async) + public final _ObjectDel + __getDelegate(boolean ami) { - if(_delegate != null) - { - return _delegate; - } - - _ObjectDel delegate = null; - if(_reference.getCollocationOptimized()) + if(_reference.getCacheConnection()) { - ObjectAdapter adapter = _reference.getInstance().objectAdapterFactory().findObjectAdapter(this); - if(adapter != null) + synchronized(this) { - _ObjectDelD d = __createDelegateD(); - d.setup(_reference, adapter); - delegate = d; + if(_delegate != null) + { + return _delegate; + } + // Connect asynchrously to avoid blocking with the proxy mutex locked. + _delegate = createDelegate(true); + return _delegate; } } - - if(delegate == null) - { - _ObjectDelM d = __createDelegateM(); - d.setup(_reference, this, async); - delegate = d; - } - - if(_reference.getCacheConnection()) + else { - // - // The _delegate attribute is only used if "cache connection" - // is enabled. If it's not enabled, we don't keep track of the - // delegate -- a new delegate is created for each invocations. - // - _delegate = delegate; + final int mode = _reference.getMode(); + return createDelegate(ami || + mode == IceInternal.Reference.ModeBatchOneway || + mode == IceInternal.Reference.ModeBatchDatagram); } - - return delegate; } synchronized public void __setRequestHandler(_ObjectDel delegate, IceInternal.RequestHandler handler) { - if(delegate == _delegate) + if(_reference.getCacheConnection()) { - if(_delegate instanceof _ObjectDelM) - { - _delegate = __createDelegateM(); - _delegate.__setRequestHandler(handler); - } - else if(_delegate instanceof _ObjectDelD) + if(delegate == _delegate) { - _delegate = __createDelegateD(); - _delegate.__setRequestHandler(handler); + if(_delegate instanceof _ObjectDelM) + { + _delegate = __createDelegateM(); + _delegate.__setRequestHandler(handler); + } + else if(_delegate instanceof _ObjectDelD) + { + _delegate = __createDelegateD(); + _delegate.__setRequestHandler(handler); + } } } } @@ -1001,6 +989,25 @@ public class ObjectPrxHelperBase implements ObjectPrx return new _ObjectDelD(); } + _ObjectDel + createDelegate(boolean async) + { + if(_reference.getCollocationOptimized()) + { + ObjectAdapter adapter = _reference.getInstance().objectAdapterFactory().findObjectAdapter(this); + if(adapter != null) + { + _ObjectDelD d = __createDelegateD(); + d.setup(_reference, adapter); + return d; + } + } + + _ObjectDelM d = __createDelegateM(); + d.setup(_reference, this, async); + return d; + } + // // Only for use by IceInternal.ProxyFactory // |