diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.cpp | 11 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.h | 1 | ||||
-rw-r--r-- | cpp/src/Ice/ServantManager.cpp | 27 | ||||
-rw-r--r-- | cpp/src/Ice/ServantManager.h | 1 |
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&); |