summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ServantManager.cpp
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2009-03-26 11:34:24 -0230
committerDwayne Boone <dwayne@zeroc.com>2009-03-26 11:34:24 -0230
commit0de45cd71fa21bcb20b8a3f754ff20cdf329ff23 (patch)
tree06c0fd3304362d39a56df0a234e90b3f84687edc /cpp/src/Ice/ServantManager.cpp
parentMore fixes to FixUtil.py (diff)
downloadice-0de45cd71fa21bcb20b8a3f754ff20cdf329ff23.tar.bz2
ice-0de45cd71fa21bcb20b8a3f754ff20cdf329ff23.tar.xz
ice-0de45cd71fa21bcb20b8a3f754ff20cdf329ff23.zip
Bug 2511 - add default servants
Diffstat (limited to 'cpp/src/Ice/ServantManager.cpp')
-rw-r--r--cpp/src/Ice/ServantManager.cpp82
1 files changed, 81 insertions, 1 deletions
diff --git a/cpp/src/Ice/ServantManager.cpp b/cpp/src/Ice/ServantManager.cpp
index 743f0bdb6b9..6562896ae0a 100644
--- a/cpp/src/Ice/ServantManager.cpp
+++ b/cpp/src/Ice/ServantManager.cpp
@@ -58,6 +58,25 @@ IceInternal::ServantManager::addServant(const ObjectPtr& object, const Identity&
p->second.insert(pair<const string, ObjectPtr>(facet, object));
}
+void
+IceInternal::ServantManager::addDefaultServant(const ObjectPtr& object, const string& category)
+{
+ IceUtil::Mutex::Lock sync(*this);
+
+ assert(_instance); // Must not be called after destruction.
+
+ DefaultServantMap::iterator p = _defaultServantMap.find(category);
+ if(p != _defaultServantMap.end())
+ {
+ AlreadyRegisteredException ex(__FILE__, __LINE__);
+ ex.kindOfObject = "default servant";
+ ex.id = category;
+ throw ex;
+ }
+
+ _defaultServantMap.insert(pair<const string, ObjectPtr>(category, object));
+}
+
ObjectPtr
IceInternal::ServantManager::removeServant(const Identity& ident, const string& facet)
{
@@ -110,6 +129,35 @@ IceInternal::ServantManager::removeServant(const Identity& ident, const string&
return servant;
}
+ObjectPtr
+IceInternal::ServantManager::removeDefaultServant(const string& category)
+{
+ //
+ // We return the removed servant to avoid releasing the last reference count
+ // with *this locked. We don't want to run user code, such as the servant
+ // destructor, with an internal Ice mutex locked.
+ //
+ ObjectPtr servant = 0;
+
+ IceUtil::Mutex::Lock sync(*this);
+
+ assert(_instance); // Must not be called after destruction.
+
+ DefaultServantMap::iterator p = _defaultServantMap.find(category);
+ if(p == _defaultServantMap.end())
+ {
+ NotRegisteredException ex(__FILE__, __LINE__);
+ ex.kindOfObject = "default servant";
+ ex.id = category;
+ throw ex;
+ }
+
+ servant = p->second;
+ _defaultServantMap.erase(p);
+
+ return servant;
+}
+
FacetMap
IceInternal::ServantManager::removeAllFacets(const Identity& ident)
{
@@ -172,7 +220,23 @@ IceInternal::ServantManager::findServant(const Identity& ident, const string& fa
if(p == servantMapMap.end() || (q = p->second.find(facet)) == p->second.end())
{
- return 0;
+ DefaultServantMap::const_iterator p = _defaultServantMap.find(ident.category);
+ if(p == _defaultServantMap.end())
+ {
+ p = _defaultServantMap.find("");
+ if(p == _defaultServantMap.end())
+ {
+ return 0;
+ }
+ else
+ {
+ return p->second;
+ }
+ }
+ else
+ {
+ return p->second;
+ }
}
else
{
@@ -181,6 +245,22 @@ IceInternal::ServantManager::findServant(const Identity& ident, const string& fa
}
}
+ObjectPtr
+IceInternal::ServantManager::findDefaultServant(const string& category) const
+{
+ IceUtil::Mutex::Lock sync(*this);
+
+ DefaultServantMap::const_iterator p = _defaultServantMap.find(category);
+ if(p == _defaultServantMap.end())
+ {
+ return 0;
+ }
+ else
+ {
+ return p->second;
+ }
+}
+
FacetMap
IceInternal::ServantManager::findAllFacets(const Identity& ident) const
{