summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp30
-rw-r--r--cpp/src/Ice/ObjectAdapterI.h4
-rw-r--r--cpp/src/Ice/ServantManager.cpp82
-rw-r--r--cpp/src/Ice/ServantManager.h6
4 files changed, 121 insertions, 1 deletions
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index 897ef753181..22832b15ac0 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -407,6 +407,16 @@ Ice::ObjectAdapterI::addFacetWithUUID(const ObjectPtr& object, const string& fac
return addFacet(object, ident, facet);
}
+void
+Ice::ObjectAdapterI::addDefaultServant(const ObjectPtr& servant, const string& category)
+{
+ IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
+
+ checkForDeactivation();
+
+ _servantManager->addDefaultServant(servant, category);
+}
+
ObjectPtr
Ice::ObjectAdapterI::remove(const Identity& ident)
{
@@ -436,6 +446,16 @@ Ice::ObjectAdapterI::removeAllFacets(const Identity& ident)
}
ObjectPtr
+Ice::ObjectAdapterI::removeDefaultServant(const string& category)
+{
+ IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
+
+ checkForDeactivation();
+
+ return _servantManager->removeDefaultServant(category);
+}
+
+ObjectPtr
Ice::ObjectAdapterI::find(const Identity& ident) const
{
return findFacet(ident, "");
@@ -474,6 +494,16 @@ Ice::ObjectAdapterI::findByProxy(const ObjectPrx& proxy) const
return findFacet(ref->getIdentity(), ref->getFacet());
}
+ObjectPtr
+Ice::ObjectAdapterI::findDefaultServant(const string& category) const
+{
+ IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
+
+ checkForDeactivation();
+
+ return _servantManager->findDefaultServant(category);
+}
+
void
Ice::ObjectAdapterI::addServantLocator(const ServantLocatorPtr& locator, const string& prefix)
{
diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h
index 58b2830e13f..5985dac062a 100644
--- a/cpp/src/Ice/ObjectAdapterI.h
+++ b/cpp/src/Ice/ObjectAdapterI.h
@@ -56,13 +56,17 @@ public:
virtual ObjectPrx addFacet(const ObjectPtr&, const Identity&, const std::string&);
virtual ObjectPrx addWithUUID(const ObjectPtr&);
virtual ObjectPrx addFacetWithUUID(const ObjectPtr&, const std::string&);
+ virtual void addDefaultServant(const ObjectPtr&, const std::string&);
virtual ObjectPtr remove(const Identity&);
virtual ObjectPtr removeFacet(const Identity&, const std::string&);
virtual FacetMap removeAllFacets(const Identity&);
+ virtual ObjectPtr removeDefaultServant(const std::string&);
virtual ObjectPtr find(const Identity&) const;
virtual ObjectPtr findFacet(const Identity&, const std::string&) const;
virtual FacetMap findAllFacets(const Identity&) const;
virtual ObjectPtr findByProxy(const ObjectPrx&) const;
+ virtual ObjectPtr findDefaultServant(const std::string&) const;
+
virtual void addServantLocator(const ServantLocatorPtr&, const std::string&);
virtual ServantLocatorPtr findServantLocator(const std::string&) const;
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
{
diff --git a/cpp/src/Ice/ServantManager.h b/cpp/src/Ice/ServantManager.h
index a06d050fa71..2cb1134e2e9 100644
--- a/cpp/src/Ice/ServantManager.h
+++ b/cpp/src/Ice/ServantManager.h
@@ -33,9 +33,12 @@ class ServantManager : public IceUtil::Shared, public IceUtil::Mutex
public:
void addServant(const Ice::ObjectPtr&, const Ice::Identity&, const std::string&);
+ void addDefaultServant(const Ice::ObjectPtr&, const std::string&);
Ice::ObjectPtr removeServant(const Ice::Identity&, const std::string&);
+ Ice::ObjectPtr removeDefaultServant(const std::string&);
Ice::FacetMap removeAllFacets(const Ice::Identity&);
Ice::ObjectPtr findServant(const Ice::Identity&, const std::string&) const;
+ Ice::ObjectPtr findDefaultServant(const std::string&) const;
Ice::FacetMap findAllFacets(const Ice::Identity&) const;
bool hasServant(const Ice::Identity&) const;
@@ -54,10 +57,13 @@ private:
const std::string _adapterName;
typedef std::map<Ice::Identity, Ice::FacetMap> ServantMapMap;
+ typedef std::map<std::string, Ice::ObjectPtr> DefaultServantMap;
ServantMapMap _servantMapMap;
mutable ServantMapMap::iterator _servantMapMapHint;
+ DefaultServantMap _defaultServantMap;
+
std::map<std::string, Ice::ServantLocatorPtr> _locatorMap;
mutable std::map<std::string, Ice::ServantLocatorPtr>::iterator _locatorMapHint;
};