diff options
author | Benoit Foucher <benoit@zeroc.com> | 2015-06-10 15:12:02 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2015-06-10 15:12:02 +0200 |
commit | e709d99c6e3b67947e545bab7ef760cf1e1cdf0f (patch) | |
tree | cf7d462ca2d441f88890a310d51da149687e4f5e /cpp/src | |
parent | Fix TestUtil.py status code handling (diff) | |
download | ice-e709d99c6e3b67947e545bab7ef760cf1e1cdf0f.tar.bz2 ice-e709d99c6e3b67947e545bab7ef760cf1e1cdf0f.tar.xz ice-e709d99c6e3b67947e545bab7ef760cf1e1cdf0f.zip |
Fixed bug in object adapter where default servants were not cleared on destroyed (ICE-6582)
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/ServantManager.cpp | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/cpp/src/Ice/ServantManager.cpp b/cpp/src/Ice/ServantManager.cpp index 99b1a862176..be20f45e704 100644 --- a/cpp/src/Ice/ServantManager.cpp +++ b/cpp/src/Ice/ServantManager.cpp @@ -24,7 +24,7 @@ void IceInternal::ServantManager::addServant(const ObjectPtr& object, const Identity& ident, const string& facet) { IceUtil::Mutex::Lock sync(*this); - + assert(_instance); // Must not be called after destruction. ServantMapMap::iterator p = _servantMapMapHint; @@ -89,7 +89,7 @@ IceInternal::ServantManager::removeServant(const Identity& ident, const string& ObjectPtr servant = 0; IceUtil::Mutex::Lock sync(*this); - + assert(_instance); // Must not be called after destruction. ServantMapMap::iterator p = _servantMapMapHint; @@ -99,7 +99,7 @@ IceInternal::ServantManager::removeServant(const Identity& ident, const string& { p = _servantMapMap.find(ident); } - + if(p == _servantMapMap.end() || (q = p->second.find(facet)) == p->second.end()) { NotRegisteredException ex(__FILE__, __LINE__); @@ -164,7 +164,7 @@ FacetMap IceInternal::ServantManager::removeAllFacets(const Identity& ident) { IceUtil::Mutex::Lock sync(*this); - + assert(_instance); // Must not be called after destruction. ServantMapMap::iterator p = _servantMapMapHint; @@ -173,7 +173,7 @@ IceInternal::ServantManager::removeAllFacets(const Identity& ident) { p = _servantMapMap.find(ident); } - + if(p == _servantMapMap.end()) { NotRegisteredException ex(__FILE__, __LINE__); @@ -201,7 +201,7 @@ ObjectPtr IceInternal::ServantManager::findServant(const Identity& ident, const string& facet) const { IceUtil::Mutex::Lock sync(*this); - + // // This assert is not valid if the adapter dispatch incoming // requests from bidir connections. This method might be called if @@ -212,14 +212,14 @@ IceInternal::ServantManager::findServant(const Identity& ident, const string& fa ServantMapMap::iterator p = _servantMapMapHint; FacetMap::iterator q; - + ServantMapMap& servantMapMap = const_cast<ServantMapMap&>(_servantMapMap); if(p == servantMapMap.end() || p->first != ident) { p = servantMapMap.find(ident); } - + if(p == servantMapMap.end() || (q = p->second.find(facet)) == p->second.end()) { DefaultServantMap::const_iterator p = _defaultServantMap.find(ident.category); @@ -267,18 +267,18 @@ FacetMap IceInternal::ServantManager::findAllFacets(const Identity& ident) const { IceUtil::Mutex::Lock sync(*this); - + assert(_instance); // Must not be called after destruction. ServantMapMap::iterator p = _servantMapMapHint; - + ServantMapMap& servantMapMap = const_cast<ServantMapMap&>(_servantMapMap); if(p == servantMapMap.end() || p->first != ident) { p = servantMapMap.find(ident); } - + if(p == servantMapMap.end()) { return FacetMap(); @@ -294,7 +294,7 @@ bool IceInternal::ServantManager::hasServant(const Identity& ident) const { IceUtil::Mutex::Lock sync(*this); - + // // This assert is not valid if the adapter dispatch incoming // requests from bidir connections. This method might be called if @@ -310,7 +310,7 @@ IceInternal::ServantManager::hasServant(const Identity& ident) const { p = servantMapMap.find(ident); } - + if(p == servantMapMap.end()) { return false; @@ -338,7 +338,7 @@ IceInternal::ServantManager::addServantLocator(const ServantLocatorPtr& locator, ex.id = category; throw ex; } - + _locatorMapHint = _locatorMap.insert(_locatorMapHint, pair<const string, ServantLocatorPtr>(category, locator)); } @@ -381,7 +381,7 @@ ServantLocatorPtr IceInternal::ServantManager::findServantLocator(const string& category) const { IceUtil::Mutex::Lock sync(*this); - + // // This assert is not valid if the adapter dispatch incoming // requests from bidir connections. This method might be called if @@ -401,12 +401,12 @@ IceInternal::ServantManager::findServantLocator(const string& category) const p = _locatorMapHint; } } - + if(p == locatorMap.end()) { p = locatorMap.find(category); } - + if(p != locatorMap.end()) { _locatorMapHint = p; @@ -440,11 +440,12 @@ void IceInternal::ServantManager::destroy() { ServantMapMap servantMapMap; + DefaultServantMap defaultServantMap; map<string, ServantLocatorPtr> locatorMap; Ice::LoggerPtr logger; { - IceUtil::Mutex::Lock sync(*this); + IceUtil::Mutex::Lock sync(*this); // // If the ServantManager has already been destroyed, we're done. // @@ -452,13 +453,17 @@ IceInternal::ServantManager::destroy() { return; } - + logger = _instance->initializationData().logger; + servantMapMap.swap(_servantMapMap); _servantMapMapHint = _servantMapMap.end(); - + + defaultServantMap.swap(_defaultServantMap); + locatorMap.swap(_locatorMap); _locatorMapHint = _locatorMap.end(); + _instance = 0; } @@ -488,8 +493,9 @@ IceInternal::ServantManager::destroy() // // We clear the maps outside the synchronization as we don't want to // hold any internal Ice mutex while running user code (such as servant - // or servant locator destructors). + // or servant locator destructors). // servantMapMap.clear(); locatorMap.clear(); + defaultServantMap.clear(); } |