summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp11
-rw-r--r--cpp/src/Ice/ObjectAdapterI.h1
-rw-r--r--cpp/src/Ice/ServantManager.cpp27
-rw-r--r--cpp/src/Ice/ServantManager.h1
4 files changed, 40 insertions, 0 deletions
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index e11d858594a..88c175a885b 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -378,6 +378,17 @@ Ice::ObjectAdapterI::findFacet(const Identity& ident, const string& facet)
return _servantManager->findServant(ident, facet);
}
+FacetMap
+Ice::ObjectAdapterI::findAllFacets(const Identity& ident)
+{
+ IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
+
+ checkForDeactivation();
+ checkIdentity(ident);
+
+ return _servantManager->findAllFacets(ident);
+}
+
ObjectPtr
Ice::ObjectAdapterI::findByProxy(const ObjectPrx& proxy)
{
diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h
index 59e3de66d2e..f6e9819c213 100644
--- a/cpp/src/Ice/ObjectAdapterI.h
+++ b/cpp/src/Ice/ObjectAdapterI.h
@@ -57,6 +57,7 @@ public:
virtual FacetMap removeAllFacets(const Identity&);
virtual ObjectPtr find(const Identity&);
virtual ObjectPtr findFacet(const Identity&, const std::string&);
+ virtual FacetMap findAllFacets(const Identity&);
virtual ObjectPtr findByProxy(const ObjectPrx&);
virtual void addServantLocator(const ServantLocatorPtr&, const std::string&);
diff --git a/cpp/src/Ice/ServantManager.cpp b/cpp/src/Ice/ServantManager.cpp
index 2e1bba0bb0a..0f926568a7e 100644
--- a/cpp/src/Ice/ServantManager.cpp
+++ b/cpp/src/Ice/ServantManager.cpp
@@ -168,6 +168,33 @@ IceInternal::ServantManager::findServant(const Identity& ident, const string& fa
}
}
+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();
+ }
+ else
+ {
+ _servantMapMapHint = p;
+ return p->second;
+ }
+}
+
bool
IceInternal::ServantManager::hasServant(const Identity& ident) const
{
diff --git a/cpp/src/Ice/ServantManager.h b/cpp/src/Ice/ServantManager.h
index 6c97d498c00..9de57a7a219 100644
--- a/cpp/src/Ice/ServantManager.h
+++ b/cpp/src/Ice/ServantManager.h
@@ -36,6 +36,7 @@ public:
void removeServant(const Ice::Identity&, const std::string&);
Ice::FacetMap removeAllFacets(const Ice::Identity&);
Ice::ObjectPtr findServant(const Ice::Identity&, const std::string&) const;
+ Ice::FacetMap findAllFacets(const Ice::Identity&) const;
bool hasServant(const Ice::Identity&) const;
void addServantLocator(const Ice::ServantLocatorPtr& locator, const std::string&);