diff options
author | Jose <jose@zeroc.com> | 2009-07-02 19:39:13 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2009-07-02 19:39:13 +0200 |
commit | b288490bceaab7f9c20eb9de62fa7a7ff4f6a917 (patch) | |
tree | 8645fb6933ced669886f71f415eb57f676912ebf /cpp/src | |
parent | Fixed test failure introduce by previous fix (diff) | |
download | ice-b288490bceaab7f9c20eb9de62fa7a7ff4f6a917.tar.bz2 ice-b288490bceaab7f9c20eb9de62fa7a7ff4f6a917.tar.xz ice-b288490bceaab7f9c20eb9de62fa7a7ff4f6a917.zip |
Bug 2564 - ObjectAdapter::removeServantLocator
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: |