summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ServantManager.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2015-06-10 15:12:02 +0200
committerBenoit Foucher <benoit@zeroc.com>2015-06-10 15:12:02 +0200
commite709d99c6e3b67947e545bab7ef760cf1e1cdf0f (patch)
treecf7d462ca2d441f88890a310d51da149687e4f5e /cpp/src/Ice/ServantManager.cpp
parentFix TestUtil.py status code handling (diff)
downloadice-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/Ice/ServantManager.cpp')
-rw-r--r--cpp/src/Ice/ServantManager.cpp48
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();
}