summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/ConnectRequestHandler.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/IceInternal/ConnectRequestHandler.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/IceInternal/ConnectRequestHandler.java')
-rw-r--r--java/src/IceInternal/ConnectRequestHandler.java46
1 files changed, 31 insertions, 15 deletions
diff --git a/java/src/IceInternal/ConnectRequestHandler.java b/java/src/IceInternal/ConnectRequestHandler.java
index 60881c35c6d..19fca77610d 100644
--- a/java/src/IceInternal/ConnectRequestHandler.java
+++ b/java/src/IceInternal/ConnectRequestHandler.java
@@ -31,24 +31,44 @@ public class ConnectRequestHandler
BasicStream os = null;
}
- public RequestHandler
+ @Override
+ public RequestHandler
connect()
{
+ Ice.ObjectPrxHelperBase proxy = _proxy;
+
_reference.getConnection(this);
-
- synchronized(this)
+
+ try
{
- if(initialized())
- {
- assert(_connection != null);
- return new ConnectionRequestHandler(_reference, _connection, _compress);
- }
- else
+ synchronized(this)
{
- _updateRequestHandler = true; // The proxy request handler will be updated when the connection is set.
- return this;
+ if(!initialized())
+ {
+ // The proxy request handler will be updated when the connection is set.
+ _updateRequestHandler = true;
+ return this;
+ }
}
}
+ catch(Ice.LocalException ex)
+ {
+ proxy.__setRequestHandler(this, null);
+ throw ex;
+ }
+
+ assert(_connection != null);
+
+ RequestHandler handler = new ConnectionRequestHandler(_reference, _connection, _compress);
+ proxy.__setRequestHandler(this, handler);
+ return handler;
+ }
+
+ @Override
+ public RequestHandler
+ update(RequestHandler previousHandler, RequestHandler newHandler)
+ {
+ return previousHandler == this ? newHandler : this;
}
@Override
@@ -233,8 +253,6 @@ public class ConnectRequestHandler
synchronized(this)
{
assert(_exception == null && _connection == null);
- assert(_updateRequestHandler || _requests.isEmpty());
-
_connection = connection;
_compress = compress;
}
@@ -260,8 +278,6 @@ public class ConnectRequestHandler
setException(final Ice.LocalException ex)
{
assert(!_initialized && _exception == null);
- assert(_updateRequestHandler || _requests.isEmpty());
-
_exception = ex;
_proxy = null; // Break cyclic reference count.