diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2009-05-07 15:25:30 -0230 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2009-05-07 15:25:30 -0230 |
commit | 370dc0863d9d68cec1eee465c16248b845ebb45c (patch) | |
tree | 61b45a55b73c6b4b7392d0f2bf82c53db1ce7690 /java/src/IceInternal/LocatorInfo.java | |
parent | Add -rdynamic linker flag (diff) | |
download | ice-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.java | 43 |
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>(); |