summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp10
-rw-r--r--cpp/src/Ice/ObjectAdapterI.h1
-rw-r--r--cpp/src/Ice/ServantManager.cpp34
-rw-r--r--cpp/src/Ice/ServantManager.h1
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: