diff options
author | Marc Laukien <marc@zeroc.com> | 2002-12-18 23:07:40 +0000 |
---|---|---|
committer | Marc Laukien <marc@zeroc.com> | 2002-12-18 23:07:40 +0000 |
commit | f9f84256f069534d1aa2d2da1652648b75e9c4bb (patch) | |
tree | 46146ad5b5e204900c0439c57ed2828befa28dd9 /cpp/src | |
parent | Append service name to program name (diff) | |
download | ice-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.cpp | 40 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterFactory.h | 1 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.cpp | 72 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.h | 1 |
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; }; } |