summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2002-12-18 23:07:40 +0000
committerMarc Laukien <marc@zeroc.com>2002-12-18 23:07:40 +0000
commitf9f84256f069534d1aa2d2da1652648b75e9c4bb (patch)
tree46146ad5b5e204900c0439c57ed2828befa28dd9 /cpp/src
parentAppend service name to program name (diff)
downloadice-f9f84256f069534d1aa2d2da1652648b75e9c4bb.tar.bz2
ice-f9f84256f069534d1aa2d2da1652648b75e9c4bb.tar.xz
ice-f9f84256f069534d1aa2d2da1652648b75e9c4bb.zip
fix to waitForShutdown/Deactivate
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/ObjectAdapterFactory.cpp40
-rw-r--r--cpp/src/Ice/ObjectAdapterFactory.h1
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp72
-rw-r--r--cpp/src/Ice/ObjectAdapterI.h1
4 files changed, 77 insertions, 37 deletions
diff --git a/cpp/src/Ice/ObjectAdapterFactory.cpp b/cpp/src/Ice/ObjectAdapterFactory.cpp
index b4419cf68ce..eb3715dc38a 100644
--- a/cpp/src/Ice/ObjectAdapterFactory.cpp
+++ b/cpp/src/Ice/ObjectAdapterFactory.cpp
@@ -50,14 +50,26 @@ IceInternal::ObjectAdapterFactory::shutdown()
void
IceInternal::ObjectAdapterFactory::waitForShutdown()
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- //
- // First we wait for the shutdown of the factory itself.
- //
- while(_instance)
{
- wait();
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ //
+ // First we wait for the shutdown of the factory itself.
+ //
+ while(_instance)
+ {
+ wait();
+ }
+
+ //
+ // If some other thread is currently shutting down, we wait
+ // until this thread is finished.
+ //
+ while(_waitForShutdown)
+ {
+ wait();
+ }
+ _waitForShutdown = true;
}
//
@@ -70,6 +82,16 @@ IceInternal::ObjectAdapterFactory::waitForShutdown()
// We're done, now we can throw away the object adapters.
//
_adapters.clear();
+
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ //
+ // Signal that waiting is complete.
+ //
+ _waitForShutdown = false;
+ notifyAll();
+ }
}
ObjectAdapterPtr
@@ -124,7 +146,8 @@ IceInternal::ObjectAdapterFactory::findObjectAdapter(const ObjectPrx& proxy)
IceInternal::ObjectAdapterFactory::ObjectAdapterFactory(const InstancePtr& instance,
const CommunicatorPtr& communicator) :
_instance(instance),
- _communicator(communicator)
+ _communicator(communicator),
+ _waitForShutdown(false)
{
}
@@ -133,4 +156,5 @@ IceInternal::ObjectAdapterFactory::~ObjectAdapterFactory()
assert(!_instance);
assert(!_communicator);
assert(_adapters.empty());
+ assert(!_waitForShutdown);
}
diff --git a/cpp/src/Ice/ObjectAdapterFactory.h b/cpp/src/Ice/ObjectAdapterFactory.h
index 5473a990c8a..7af6b0f6abb 100644
--- a/cpp/src/Ice/ObjectAdapterFactory.h
+++ b/cpp/src/Ice/ObjectAdapterFactory.h
@@ -41,6 +41,7 @@ private:
InstancePtr _instance;
::Ice::CommunicatorPtr _communicator;
std::map<std::string, ::Ice::ObjectAdapterIPtr> _adapters;
+ bool _waitForShutdown;
};
}
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index f8a3311173e..09f94d1b1ff 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -164,8 +164,6 @@ Ice::ObjectAdapterI::deactivate()
void
Ice::ObjectAdapterI::waitForDeactivate()
{
- map<string, ServantLocatorPtr> locatorMap;
-
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
@@ -179,38 +177,39 @@ Ice::ObjectAdapterI::waitForDeactivate()
}
//
- // Now we wait for until all incoming connection factories are
- // finished.
- //
- for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
- Ice::voidMemFun(&IncomingConnectionFactory::waitUntilFinished));
-
- //
- // We're done, now we can throw away all incoming connection
- // factories.
+ // If some other thread is currently deactivating, we wait
+ // until this thread is finished.
//
- _incomingConnectionFactories.clear();
+ while(_waitForDeactivate)
+ {
+ wait();
+ }
+ _waitForDeactivate = true;
+ }
- //
- // Now it's also time to clean up the active servant map.
- //
- _activeServantMap.clear();
- _activeServantMapHint = _activeServantMap.end();
+ //
+ // Now we wait for until all incoming connection factories are
+ // finished.
+ //
+ for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
+ Ice::voidMemFun(&IncomingConnectionFactory::waitUntilFinished));
+
+ //
+ // We're done, now we can throw away all incoming connection
+ // factories.
+ //
+ _incomingConnectionFactories.clear();
- //
- // And the servant locators, too (first we make a copy of the
- // map in order to invoke servant locator deactivate method
- // outside the synchronization block).
- //
- locatorMap = _locatorMap;
- _locatorMap.clear();
- _locatorMapHint = _locatorMap.end();
- }
+ //
+ // Now it's also time to clean up the active servant map.
+ //
+ _activeServantMap.clear();
+ _activeServantMapHint = _activeServantMap.end();
//
- // Deactivate servant locators.
+ // And the servant locators, too.
//
- for(map<string, ServantLocatorPtr>::iterator p = locatorMap.begin(); p != locatorMap.end(); ++p)
+ for(map<string, ServantLocatorPtr>::iterator p = _locatorMap.begin(); p != _locatorMap.end(); ++p)
{
try
{
@@ -232,6 +231,19 @@ Ice::ObjectAdapterI::waitForDeactivate()
<< "locator prefix: `" << p->first << "'";
}
}
+
+ _locatorMap.clear();
+ _locatorMapHint = _locatorMap.end();
+
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ //
+ // Signal that waiting is complete.
+ //
+ _waitForDeactivate = false;
+ notifyAll();
+ }
}
ObjectPrx
@@ -581,7 +593,8 @@ Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const Communica
_logger(instance->logger()),
_activeServantMapHint(_activeServantMap.end()),
_locatorMapHint(_locatorMap.end()),
- _directCount(0)
+ _directCount(0),
+ _waitForDeactivate(false)
{
string s(endpts);
transform(s.begin(), s.end(), s.begin(), ::tolower);
@@ -649,6 +662,7 @@ Ice::ObjectAdapterI::~ObjectAdapterI()
assert(_activeServantMap.empty());
assert(_locatorMap.empty());
assert(_directCount == 0);
+ assert(!_waitForDeactivate);
}
}
diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h
index de2f08459bf..e76ac920d76 100644
--- a/cpp/src/Ice/ObjectAdapterI.h
+++ b/cpp/src/Ice/ObjectAdapterI.h
@@ -102,6 +102,7 @@ private:
IceUtil::Mutex _routerEndpointsMutex;
::IceInternal::LocatorInfoPtr _locatorInfo;
int _directCount; // The number of direct proxies dispatching on this object adapter.
+ bool _waitForDeactivate;
};
}