summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ObjectAdapterFactory.cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2002-12-14 22:19:03 +0000
committerMarc Laukien <marc@zeroc.com>2002-12-14 22:19:03 +0000
commita41bb120db0ccdea5eea58e26bd30eddaff40877 (patch)
tree955f720fb895739a61764d56234ac4a9595a1441 /cpp/src/Ice/ObjectAdapterFactory.cpp
parentsome fixes (diff)
downloadice-a41bb120db0ccdea5eea58e26bd30eddaff40877.tar.bz2
ice-a41bb120db0ccdea5eea58e26bd30eddaff40877.tar.xz
ice-a41bb120db0ccdea5eea58e26bd30eddaff40877.zip
complete shutdown/deactivate re-implementation
Diffstat (limited to 'cpp/src/Ice/ObjectAdapterFactory.cpp')
-rw-r--r--cpp/src/Ice/ObjectAdapterFactory.cpp72
1 files changed, 67 insertions, 5 deletions
diff --git a/cpp/src/Ice/ObjectAdapterFactory.cpp b/cpp/src/Ice/ObjectAdapterFactory.cpp
index f10d21a3cc9..b4419cf68ce 100644
--- a/cpp/src/Ice/ObjectAdapterFactory.cpp
+++ b/cpp/src/Ice/ObjectAdapterFactory.cpp
@@ -14,6 +14,7 @@
#include <Ice/ObjectAdapterFactory.h>
#include <Ice/ObjectAdapterI.h>
+#include <Ice/LocalException.h>
#include <Ice/Functional.h>
using namespace std;
@@ -26,18 +27,60 @@ void IceInternal::decRef(ObjectAdapterFactory* p) { p->__decRef(); }
void
IceInternal::ObjectAdapterFactory::shutdown()
{
- IceUtil::Mutex::Lock sync(*this);
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ //
+ // Ignore shutdown requests if the object adapter factory has
+ // already been shut down.
+ //
+ if(!_instance)
+ {
+ return;
+ }
+
for_each(_adapters.begin(), _adapters.end(),
Ice::secondVoidMemFun<string, ObjectAdapter>(&ObjectAdapter::deactivate));
+
+ _instance = 0;
+ _communicator = 0;
+ notifyAll();
+}
+
+void
+IceInternal::ObjectAdapterFactory::waitForShutdown()
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ //
+ // First we wait for the shutdown of the factory itself.
+ //
+ while(_instance)
+ {
+ wait();
+ }
+
+ //
+ // Now we wait for deactivation of each object adapter.
+ //
+ for_each(_adapters.begin(), _adapters.end(),
+ Ice::secondVoidMemFun<string, ObjectAdapter>(&ObjectAdapter::waitForDeactivate));
+
+ //
+ // We're done, now we can throw away the object adapters.
+ //
_adapters.clear();
}
ObjectAdapterPtr
IceInternal::ObjectAdapterFactory::createObjectAdapter(const string& name, const string& endpts, const string& id)
{
- IceUtil::Mutex::Lock sync(*this);
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ if(!_instance)
+ {
+ throw CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
map<string, ObjectAdapterIPtr>::iterator p = _adapters.find(name);
if(p != _adapters.end())
@@ -53,13 +96,25 @@ IceInternal::ObjectAdapterFactory::createObjectAdapter(const string& name, const
ObjectAdapterPtr
IceInternal::ObjectAdapterFactory::findObjectAdapter(const ObjectPrx& proxy)
{
- IceUtil::Mutex::Lock sync(*this);
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ if(!_instance)
+ {
+ throw CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
for(map<string, ObjectAdapterIPtr>::iterator p = _adapters.begin(); p != _adapters.end(); ++p)
{
- if(p->second->isLocal(proxy))
+ try
{
- return p->second;
+ if(p->second->isLocal(proxy))
+ {
+ return p->second;
+ }
+ }
+ catch(const ObjectAdapterDeactivatedException&)
+ {
+ // Ignore.
}
}
@@ -72,3 +127,10 @@ IceInternal::ObjectAdapterFactory::ObjectAdapterFactory(const InstancePtr& insta
_communicator(communicator)
{
}
+
+IceInternal::ObjectAdapterFactory::~ObjectAdapterFactory()
+{
+ assert(!_instance);
+ assert(!_communicator);
+ assert(_adapters.empty());
+}