summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/LocatorInfo.java
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2009-05-07 15:25:30 -0230
committerDwayne Boone <dwayne@zeroc.com>2009-05-07 15:25:30 -0230
commit370dc0863d9d68cec1eee465c16248b845ebb45c (patch)
tree61b45a55b73c6b4b7392d0f2bf82c53db1ce7690 /java/src/IceInternal/LocatorInfo.java
parentAdd -rdynamic linker flag (diff)
downloadice-370dc0863d9d68cec1eee465c16248b845ebb45c.tar.bz2
ice-370dc0863d9d68cec1eee465c16248b845ebb45c.tar.xz
ice-370dc0863d9d68cec1eee465c16248b845ebb45c.zip
Bug 3966 - deadlock in LocatorInfo
Diffstat (limited to 'java/src/IceInternal/LocatorInfo.java')
-rw-r--r--java/src/IceInternal/LocatorInfo.java43
1 files changed, 37 insertions, 6 deletions
diff --git a/java/src/IceInternal/LocatorInfo.java b/java/src/IceInternal/LocatorInfo.java
index cfb06e9d0e7..c4d977fb223 100644
--- a/java/src/IceInternal/LocatorInfo.java
+++ b/java/src/IceInternal/LocatorInfo.java
@@ -329,6 +329,7 @@ public final class LocatorInfo
_locator = locator;
_table = table;
_background = background;
+ _waitForRegistry = false;
}
synchronized public void
@@ -363,20 +364,49 @@ public final class LocatorInfo
return _locator;
}
- public synchronized Ice.LocatorRegistryPrx
+ public Ice.LocatorRegistryPrx
getLocatorRegistry()
{
- if(_locatorRegistry == null) // Lazy initialization
+ Ice.LocatorPrx locator = null;
+ synchronized(this)
{
- _locatorRegistry = _locator.getRegistry();
+ while(_waitForRegistry)
+ {
+ try
+ {
+ wait();
+ }
+ catch(InterruptedException ex)
+ {
+ }
+ }
+ if(_locatorRegistry != null)
+ {
+ return _locatorRegistry;
+ }
+
+ _waitForRegistry = true;
+ locator = _locator;
+ }
+
+ //
+ // Do not make locator calls from within sync.
+ //
+ Ice.LocatorRegistryPrx locatorRegistry = locator.getRegistry();
+
+ synchronized(this)
+ {
//
// The locator registry can't be located.
//
- _locatorRegistry = Ice.LocatorRegistryPrxHelper.uncheckedCast(_locatorRegistry.ice_locator(null));
+ _locatorRegistry = Ice.LocatorRegistryPrxHelper.uncheckedCast(locatorRegistry.ice_locator(null));
+
+ _waitForRegistry = false;
+ notifyAll();
+
+ return _locatorRegistry;
}
-
- return _locatorRegistry;
}
public EndpointI[]
@@ -793,6 +823,7 @@ public final class LocatorInfo
private Ice.LocatorRegistryPrx _locatorRegistry;
private final LocatorTable _table;
private final boolean _background;
+ private boolean _waitForRegistry;
private java.util.Map<String, Request> _adapterRequests = new java.util.HashMap<String, Request>();
private java.util.Map<Ice.Identity, Request> _objectRequests = new java.util.HashMap<Ice.Identity, Request>();