diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.cpp | 10 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.h | 1 | ||||
-rw-r--r-- | cpp/src/Ice/ServantManager.cpp | 34 | ||||
-rw-r--r-- | cpp/src/Ice/ServantManager.h | 1 |
4 files changed, 46 insertions, 0 deletions
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp index 9b56129c144..62f71b61737 100644 --- a/cpp/src/Ice/ObjectAdapterI.cpp +++ b/cpp/src/Ice/ObjectAdapterI.cpp @@ -515,6 +515,16 @@ Ice::ObjectAdapterI::addServantLocator(const ServantLocatorPtr& locator, const s } ServantLocatorPtr +Ice::ObjectAdapterI::removeServantLocator(const string& prefix) +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + checkForDeactivation(); + + return _servantManager->removeServantLocator(prefix); +} + +ServantLocatorPtr Ice::ObjectAdapterI::findServantLocator(const string& prefix) const { IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h index e550254fc91..201be76287d 100644 --- a/cpp/src/Ice/ObjectAdapterI.h +++ b/cpp/src/Ice/ObjectAdapterI.h @@ -69,6 +69,7 @@ public: virtual void addServantLocator(const ServantLocatorPtr&, const std::string&); + virtual ServantLocatorPtr removeServantLocator(const std::string&); virtual ServantLocatorPtr findServantLocator(const std::string&) const; virtual ObjectPrx createProxy(const Identity&) const; diff --git a/cpp/src/Ice/ServantManager.cpp b/cpp/src/Ice/ServantManager.cpp index 1f6b5622231..4820b979350 100644 --- a/cpp/src/Ice/ServantManager.cpp +++ b/cpp/src/Ice/ServantManager.cpp @@ -341,6 +341,40 @@ IceInternal::ServantManager::addServantLocator(const ServantLocatorPtr& locator, } ServantLocatorPtr +IceInternal::ServantManager::removeServantLocator(const string& category) +{ + IceUtil::Mutex::Lock sync(*this); + + assert(_instance); // Must not be called after destruction. + + map<string, ServantLocatorPtr>::iterator p = _locatorMap.end(); + if(_locatorMapHint != p) + { + if(_locatorMapHint->first == category) + { + p = _locatorMapHint; + } + } + + if(p == _locatorMap.end()) + { + p = _locatorMap.find(category); + } + + ServantLocatorPtr locator; + + if(p != _locatorMap.end()) + { + locator = p->second; + locator->deactivate(p->first); + _locatorMap.erase(p); + _locatorMapHint = _locatorMap.begin(); + } + + return locator; +} + +ServantLocatorPtr IceInternal::ServantManager::findServantLocator(const string& category) const { IceUtil::Mutex::Lock sync(*this); diff --git a/cpp/src/Ice/ServantManager.h b/cpp/src/Ice/ServantManager.h index 2cb1134e2e9..9699fde9c04 100644 --- a/cpp/src/Ice/ServantManager.h +++ b/cpp/src/Ice/ServantManager.h @@ -43,6 +43,7 @@ public: bool hasServant(const Ice::Identity&) const; void addServantLocator(const Ice::ServantLocatorPtr& locator, const std::string&); + Ice::ServantLocatorPtr removeServantLocator(const std::string&); Ice::ServantLocatorPtr findServantLocator(const std::string&) const; private: |