summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ObjectAdapterFactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/ObjectAdapterFactory.cpp')
-rw-r--r--cpp/src/Ice/ObjectAdapterFactory.cpp29
1 files changed, 24 insertions, 5 deletions
diff --git a/cpp/src/Ice/ObjectAdapterFactory.cpp b/cpp/src/Ice/ObjectAdapterFactory.cpp
index 03ca3d518c5..bbd67ffd6eb 100644
--- a/cpp/src/Ice/ObjectAdapterFactory.cpp
+++ b/cpp/src/Ice/ObjectAdapterFactory.cpp
@@ -84,11 +84,6 @@ IceInternal::ObjectAdapterFactory::waitForShutdown()
for_each(_adapters.begin(), _adapters.end(),
IceUtil::secondVoidMemFun<const string, ObjectAdapterI>(&ObjectAdapter::waitForDeactivate));
- //
- // We're done, now we can throw away the object adapters.
- //
- _adapters.clear();
-
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
@@ -100,6 +95,30 @@ IceInternal::ObjectAdapterFactory::waitForShutdown()
}
}
+void
+IceInternal::ObjectAdapterFactory::destroy()
+{
+ //
+ // First wait for shutdown to finish.
+ //
+ waitForShutdown();
+
+ map<string, ObjectAdapterIPtr> adapters;
+
+ {
+ IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
+
+ adapters = _adapters;
+ _adapters.clear();
+ }
+
+ //
+ // Now we destroy each object adapter.
+ //
+ for_each(adapters.begin(), adapters.end(),
+ IceUtil::secondVoidMemFun<const string, ObjectAdapterI>(&ObjectAdapter::destroy));
+}
+
ObjectAdapterPtr
IceInternal::ObjectAdapterFactory::createObjectAdapter(const string& name, const string& endpoints,
const RouterPrx& router)