diff options
author | Benoit Foucher <benoit@zeroc.com> | 2014-09-26 18:39:28 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2014-09-26 18:39:28 +0200 |
commit | aa3c4ebfa279188cf689c6ef2318ed573c4fec7b (patch) | |
tree | c7c1c9b7b6ce2daee3cd9b5507a49d3520fd1d06 /java/src/Ice/ObjectPrxHelperBase.java | |
parent | Slightly improved fix for ICE-3692 (diff) | |
download | ice-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.java | 70 |
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); |