summaryrefslogtreecommitdiff
path: root/java/src/Ice/ObjectPrxHelperBase.java
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2014-09-26 18:39:28 +0200
committerBenoit Foucher <benoit@zeroc.com>2014-09-26 18:39:28 +0200
commitaa3c4ebfa279188cf689c6ef2318ed573c4fec7b (patch)
treec7c1c9b7b6ce2daee3cd9b5507a49d3520fd1d06 /java/src/Ice/ObjectPrxHelperBase.java
parentSlightly improved fix for ICE-3692 (diff)
downloadice-aa3c4ebfa279188cf689c6ef2318ed573c4fec7b.tar.bz2
ice-aa3c4ebfa279188cf689c6ef2318ed573c4fec7b.tar.xz
ice-aa3c4ebfa279188cf689c6ef2318ed573c4fec7b.zip
Fixed deadlock in connection binding code (ICE-5693)
Diffstat (limited to 'java/src/Ice/ObjectPrxHelperBase.java')
-rw-r--r--java/src/Ice/ObjectPrxHelperBase.java70
1 files changed, 17 insertions, 53 deletions
diff --git a/java/src/Ice/ObjectPrxHelperBase.java b/java/src/Ice/ObjectPrxHelperBase.java
index 8c8d719570a..82d138470b0 100644
--- a/java/src/Ice/ObjectPrxHelperBase.java
+++ b/java/src/Ice/ObjectPrxHelperBase.java
@@ -2752,6 +2752,7 @@ public class ObjectPrxHelperBase implements ObjectPrx, java.io.Serializable
public final IceInternal.RequestHandler
__getRequestHandler()
{
+ IceInternal.RequestHandler handler;
if(_reference.getCacheConnection())
{
synchronized(this)
@@ -2761,11 +2762,14 @@ public class ObjectPrxHelperBase implements ObjectPrx, java.io.Serializable
return _requestHandler;
}
_requestHandler = createRequestHandler();
- return _requestHandler;
+ handler = _requestHandler;
}
}
-
- return createRequestHandler();
+ else
+ {
+ handler = createRequestHandler();
+ }
+ return handler.connect();
}
public void
@@ -2775,56 +2779,16 @@ public class ObjectPrxHelperBase implements ObjectPrx, java.io.Serializable
{
synchronized(this)
{
- if(previous == _requestHandler)
- {
- if(handler != null)
- {
- if(_reference.getInstance().queueRequests())
- {
- _requestHandler = new QueueRequestHandler(_reference.getInstance(), handler);
- }
- else
- {
- _requestHandler = handler;
- }
- }
- else
- {
- _requestHandler = null;
- }
- }
- else if(previous != null && _requestHandler != null)
+ if(_requestHandler != handler)
{
- try
- {
- //
- // If both request handlers point to the same connection, we also
- // update the request handler. See bug ICE-5489 for reasons why
- // this can be useful.
- //
- if(previous.getConnection() == _requestHandler.getConnection())
- {
- if(handler != null)
- {
- if(_reference.getInstance().queueRequests())
- {
- _requestHandler = new QueueRequestHandler(_reference.getInstance(), handler);
- }
- else
- {
- _requestHandler = handler;
- }
- }
- else
- {
- _requestHandler = null;
- }
- }
- }
- catch(Ice.Exception ex)
- {
- // Ignore
- }
+ //
+ // Update the request handler only if "previous" is the same
+ // as the current request handler. This is called after
+ // connection binding by the connect request handler. We only
+ // replace the request handler if the current handler is the
+ // connect request handler.
+ //
+ _requestHandler = _requestHandler.update(previous, handler);
}
}
}
@@ -2855,7 +2819,7 @@ public class ObjectPrxHelperBase implements ObjectPrx, java.io.Serializable
}
}
- IceInternal.RequestHandler handler = (new IceInternal.ConnectRequestHandler(_reference, this)).connect();
+ IceInternal.RequestHandler handler = new IceInternal.ConnectRequestHandler(_reference, this);
if(_reference.getInstance().queueRequests())
{
handler = new QueueRequestHandler(_reference.getInstance(), handler);