summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ObjectAdapterFactory.cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2004-11-23 16:12:01 +0000
committerMarc Laukien <marc@zeroc.com>2004-11-23 16:12:01 +0000
commitf5e09f54c6546214acad983e7b503767f16ce6de (patch)
tree73ac893a38fc13ba74d133e43166e08a758f1ead /cpp/src/Ice/ObjectAdapterFactory.cpp
parentReference refactoring. (diff)
downloadice-f5e09f54c6546214acad983e7b503767f16ce6de.tar.bz2
ice-f5e09f54c6546214acad983e7b503767f16ce6de.tar.xz
ice-f5e09f54c6546214acad983e7b503767f16ce6de.zip
fix
Diffstat (limited to 'cpp/src/Ice/ObjectAdapterFactory.cpp')
-rw-r--r--cpp/src/Ice/ObjectAdapterFactory.cpp36
1 files changed, 23 insertions, 13 deletions
diff --git a/cpp/src/Ice/ObjectAdapterFactory.cpp b/cpp/src/Ice/ObjectAdapterFactory.cpp
index aa0948387b2..60a2706f99b 100644
--- a/cpp/src/Ice/ObjectAdapterFactory.cpp
+++ b/cpp/src/Ice/ObjectAdapterFactory.cpp
@@ -22,24 +22,34 @@ void IceInternal::decRef(ObjectAdapterFactory* p) { p->__decRef(); }
void
IceInternal::ObjectAdapterFactory::shutdown()
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ map<string, ObjectAdapterIPtr> adapters;
- //
- // Ignore shutdown requests if the object adapter factory has
- // already been shut down.
- //
- if(!_instance)
{
- return;
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ //
+ // Ignore shutdown requests if the object adapter factory has
+ // already been shut down.
+ //
+ if(!_instance)
+ {
+ return;
+ }
+
+ adapters = _adapters;
+
+ _instance = 0;
+ _communicator = 0;
+
+ notifyAll();
}
- for_each(_adapters.begin(), _adapters.end(),
+ //
+ // Deactivate outside the thread synchronization, to avoid
+ // deadlocks.
+ //
+ for_each(adapters.begin(), adapters.end(),
IceUtil::secondVoidMemFun<const string, ObjectAdapterI>(&ObjectAdapter::deactivate));
-
- _instance = 0;
- _communicator = 0;
-
- notifyAll();
}
void