summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/ObjectAdapterFactory.java
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2005-08-24 16:43:37 +0000
committerDwayne Boone <dwayne@zeroc.com>2005-08-24 16:43:37 +0000
commit4f81a765b310c1365e27196bd97bd90a0a0ac174 (patch)
tree1ccecfec8b414dfbf79b513cb606de30dcb46403 /java/src/IceInternal/ObjectAdapterFactory.java
parenttrap exception from checkedCast (diff)
downloadice-4f81a765b310c1365e27196bd97bd90a0a0ac174.tar.bz2
ice-4f81a765b310c1365e27196bd97bd90a0a0ac174.tar.xz
ice-4f81a765b310c1365e27196bd97bd90a0a0ac174.zip
Modified sync in shutdown
Diffstat (limited to 'java/src/IceInternal/ObjectAdapterFactory.java')
-rw-r--r--java/src/IceInternal/ObjectAdapterFactory.java41
1 files changed, 25 insertions, 16 deletions
diff --git a/java/src/IceInternal/ObjectAdapterFactory.java b/java/src/IceInternal/ObjectAdapterFactory.java
index f3548057bb0..db364e0b4cf 100644
--- a/java/src/IceInternal/ObjectAdapterFactory.java
+++ b/java/src/IceInternal/ObjectAdapterFactory.java
@@ -11,29 +11,38 @@ package IceInternal;
public final class ObjectAdapterFactory
{
- public synchronized void
+ public void
shutdown()
{
- //
- // Ignore shutdown requests if the object adapter factory has
- // already been shut down.
- //
- if(_instance == null)
+ Ice.ObjectAdapter[] adapters;
+
+ synchronized(this)
{
- return;
+ //
+ // Ignore shutdown requests if the object adapter factory has
+ // already been shut down.
+ //
+ if(_instance == null)
+ {
+ return;
+ }
+
+ adapters = (Ice.ObjectAdapter[])_adapters.values().toArray(new Ice.ObjectAdapter[0]);
+
+ _instance = null;
+ _communicator = null;
+
+ notifyAll();
}
- java.util.Iterator i = _adapters.values().iterator();
- while(i.hasNext())
+ //
+ // Deactivate outside the thread synchronization, to avoid
+ // deadlocks.
+ //
+ for(int i = 0; i < adapters.length; ++i)
{
- Ice.ObjectAdapter adapter = (Ice.ObjectAdapter)i.next();
- adapter.deactivate();
+ adapters[i].deactivate();
}
-
- _instance = null;
- _communicator = null;
-
- notifyAll();
}
public void