summaryrefslogtreecommitdiff
path: root/java/src/Ice/ObjectPrxHelperBase.java
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2008-03-21 12:59:03 +0100
committerBenoit Foucher <benoit@zeroc.com>2008-03-21 12:59:03 +0100
commit7971802906584415f7eefe7cabe8aadbbec9d7d1 (patch)
tree10065f4982766e346d5e52b5b21e28ff6d708a2d /java/src/Ice/ObjectPrxHelperBase.java
parentFixed dependency for mulicastC on multicastS (diff)
downloadice-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.java89
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
//