summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/.depend2
-rw-r--r--cpp/src/Ice/Collector.cpp9
-rw-r--r--cpp/src/Ice/CommunicatorI.cpp26
-rw-r--r--cpp/src/Ice/CommunicatorI.h4
-rw-r--r--cpp/src/Ice/Direct.cpp11
-rw-r--r--cpp/src/Ice/Incoming.cpp11
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp86
-rw-r--r--cpp/src/Ice/ObjectAdapterI.h8
-rw-r--r--cpp/src/Ice/Proxy.cpp10
-rw-r--r--cpp/src/Ice/ServantFactoryManager.cpp42
-rw-r--r--cpp/src/Ice/ServantFactoryManager.h8
-rw-r--r--cpp/src/Ice/Stream.cpp2
-rw-r--r--cpp/src/IcePack/Server.cpp2
13 files changed, 164 insertions, 57 deletions
diff --git a/cpp/src/Ice/.depend b/cpp/src/Ice/.depend
index 2b3ddd9a4a8..ca0f0396472 100644
--- a/cpp/src/Ice/.depend
+++ b/cpp/src/Ice/.depend
@@ -17,7 +17,7 @@ ObjectAdapter.o: ObjectAdapter.cpp ../../include/Ice/ObjectAdapter.h ../../inclu
ObjectAdapterI.o: ObjectAdapterI.cpp ../Ice/ObjectAdapterI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/Ice/CommunicatorF.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/CollectorF.h ../../include/Ice/LocalException.h ../Ice/Instance.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/EmitterF.h ../Ice/ServantFactoryManagerF.h ../../include/Ice/PicklerF.h ../../include/Ice/Proxy.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../Ice/ProxyFactory.h ../Ice/Reference.h ../Ice/EndpointF.h ../Ice/Endpoint.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/Collector.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/Stream.h ../../include/Ice/Buffer.h ../../include/Ice/Properties.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h
ObjectAdapterFactory.o: ObjectAdapterFactory.cpp ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/Ice/CommunicatorF.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/CollectorF.h ../../include/Ice/LocalException.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/Instance.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/EmitterF.h ../Ice/ServantFactoryManagerF.h ../../include/Ice/PicklerF.h
ServantFactory.o: ServantFactory.cpp ../../include/Ice/ServantFactory.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/Stream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h
-ServantFactoryManager.o: ServantFactoryManager.cpp ../Ice/ServantFactoryManager.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/ServantFactoryManagerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ServantFactoryF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/Ice/ServantFactory.h
+ServantFactoryManager.o: ServantFactoryManager.cpp ../Ice/ServantFactoryManager.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/ServantFactoryManagerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ServantFactoryF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../../include/Ice/ServantFactory.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h
Endpoint.o: Endpoint.cpp ../Ice/Endpoint.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/EndpointF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/Network.h ../Ice/TcpAcceptor.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Native.h ../../include/Ice/LocalObject.h ../Ice/Acceptor.h ../Ice/TcpConnector.h ../Ice/Connector.h ../Ice/TcpTransceiver.h ../Ice/Transceiver.h ../Ice/SslAcceptor.h ../Ice/SslConnector.h ../Ice/SslTransceiver.h ../Ice/UdpTransceiver.h ../../include/Ice/Stream.h ../../include/Ice/Buffer.h ../../include/Ice/LocalException.h
Reference.o: Reference.cpp ../Ice/Reference.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/ReferenceF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../Ice/EndpointF.h ../../include/Ice/InstanceF.h ../Ice/Endpoint.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/Stream.h ../../include/Ice/ObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Buffer.h ../../include/Ice/LocalException.h
LocalObject.o: LocalObject.cpp ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h
diff --git a/cpp/src/Ice/Collector.cpp b/cpp/src/Ice/Collector.cpp
index a6128e2ef36..0726ca0ed9b 100644
--- a/cpp/src/Ice/Collector.cpp
+++ b/cpp/src/Ice/Collector.cpp
@@ -515,8 +515,7 @@ IceInternal::CollectorFactory::message(Stream&)
//
// Can't use _collectors.remove_if(constMemFun(...)), because VC++
// doesn't support member templates :-(
- _collectors.erase(remove_if(_collectors.begin(), _collectors.end(),
- ::IceInternal::constMemFun(&Collector::destroyed)),
+ _collectors.erase(remove_if(_collectors.begin(), _collectors.end(), ::Ice::constMemFun(&Collector::destroyed)),
_collectors.end());
//
@@ -623,7 +622,7 @@ IceInternal::CollectorFactory::setState(State state)
_threadPool->_register(_acceptor->fd(), this);
}
- for_each(_collectors.begin(), _collectors.end(), ::IceInternal::voidMemFun(&Collector::activate));
+ for_each(_collectors.begin(), _collectors.end(), ::Ice::voidMemFun(&Collector::activate));
break;
}
@@ -639,7 +638,7 @@ IceInternal::CollectorFactory::setState(State state)
_threadPool->unregister(_acceptor->fd());
}
- for_each(_collectors.begin(), _collectors.end(), ::IceInternal::voidMemFun(&Collector::hold));
+ for_each(_collectors.begin(), _collectors.end(), ::Ice::voidMemFun(&Collector::hold));
break;
}
@@ -662,7 +661,7 @@ IceInternal::CollectorFactory::setState(State state)
_threadPool->unregister(_acceptor->fd());
}
}
- for_each(_collectors.begin(), _collectors.end(), ::IceInternal::voidMemFun(&Collector::destroy));
+ for_each(_collectors.begin(), _collectors.end(), ::Ice::voidMemFun(&Collector::destroy));
_collectors.clear();
break;
}
diff --git a/cpp/src/Ice/CommunicatorI.cpp b/cpp/src/Ice/CommunicatorI.cpp
index eea0778af89..9ba6b1f2702 100644
--- a/cpp/src/Ice/CommunicatorI.cpp
+++ b/cpp/src/Ice/CommunicatorI.cpp
@@ -102,14 +102,36 @@ Ice::CommunicatorI::createObjectAdapterWithEndpoints(const string& name, const s
}
void
-Ice::CommunicatorI::installServantFactory(const ServantFactoryPtr& factory, const string& id)
+Ice::CommunicatorI::addServantFactory(const ServantFactoryPtr& factory, const string& id)
{
JTCSyncT<JTCRecursiveMutex> sync(*this);
if (!_instance)
{
throw CommunicatorDestroyedException(__FILE__, __LINE__);
}
- _instance->servantFactoryManager()->install(factory, id);
+ _instance->servantFactoryManager()->add(factory, id);
+}
+
+void
+Ice::CommunicatorI::removeServantFactory(const string& id)
+{
+ JTCSyncT<JTCRecursiveMutex> sync(*this);
+ if (!_instance)
+ {
+ throw CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
+ _instance->servantFactoryManager()->remove(id);
+}
+
+ServantFactoryPtr
+Ice::CommunicatorI::findServantFactory(const string& id)
+{
+ JTCSyncT<JTCRecursiveMutex> sync(*this);
+ if (!_instance)
+ {
+ throw CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
+ return _instance->servantFactoryManager()->find(id);
}
PropertiesPtr
diff --git a/cpp/src/Ice/CommunicatorI.h b/cpp/src/Ice/CommunicatorI.h
index eaf797102f7..e60eb8fdef0 100644
--- a/cpp/src/Ice/CommunicatorI.h
+++ b/cpp/src/Ice/CommunicatorI.h
@@ -32,7 +32,9 @@ public:
virtual ObjectAdapterPtr createObjectAdapter(const std::string&);
virtual ObjectAdapterPtr createObjectAdapterWithEndpoints(const std::string&, const std::string&);
- virtual void installServantFactory(const ServantFactoryPtr&, const std::string&);
+ virtual void addServantFactory(const ServantFactoryPtr&, const std::string&);
+ virtual void removeServantFactory(const std::string&);
+ virtual ServantFactoryPtr findServantFactory(const std::string&);
virtual PropertiesPtr getProperties();
diff --git a/cpp/src/Ice/Direct.cpp b/cpp/src/Ice/Direct.cpp
index 59a57e1a4d0..c8a40bf63eb 100644
--- a/cpp/src/Ice/Direct.cpp
+++ b/cpp/src/Ice/Direct.cpp
@@ -29,7 +29,16 @@ IceInternal::Direct::Direct(const ObjectAdapterPtr& adapter, const ReferencePtr&
{
if (!_servant)
{
- _locator = _adapter->getServantLocator();
+ string::size_type pos = _reference->identity.find('#');
+ if (pos != string::npos)
+ {
+ _locator = _adapter->findServantLocator(_reference->identity.substr(0, pos));
+ }
+ else
+ {
+ _locator = _adapter->findServantLocator("");
+ }
+
if (_locator)
{
_servant = _locator->locate(_adapter, _reference->identity, _operation, _cookie);
diff --git a/cpp/src/Ice/Incoming.cpp b/cpp/src/Ice/Incoming.cpp
index f54520a35fb..f9a74512494 100644
--- a/cpp/src/Ice/Incoming.cpp
+++ b/cpp/src/Ice/Incoming.cpp
@@ -47,7 +47,16 @@ IceInternal::Incoming::invoke(Stream& is)
{
if (!servant)
{
- locator = _adapter->getServantLocator();
+ string::size_type pos = identity.find('#');
+ if (pos != string::npos)
+ {
+ locator = _adapter->findServantLocator(identity.substr(0, pos));
+ }
+ else
+ {
+ locator = _adapter->findServantLocator("");
+ }
+
if (locator)
{
servant = locator->locate(_adapter, identity, operation, cookie);
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index 0790e49de34..56aa2301eb8 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -52,8 +52,7 @@ Ice::ObjectAdapterI::activate()
throw ObjectAdapterDeactivatedException(__FILE__, __LINE__);
}
- for_each(_collectorFactories.begin(), _collectorFactories.end(),
- ::IceInternal::voidMemFun(&CollectorFactory::activate));
+ for_each(_collectorFactories.begin(), _collectorFactories.end(), Ice::voidMemFun(&CollectorFactory::activate));
}
void
@@ -66,8 +65,7 @@ Ice::ObjectAdapterI::hold()
throw ObjectAdapterDeactivatedException(__FILE__, __LINE__);
}
- for_each(_collectorFactories.begin(), _collectorFactories.end(),
- ::IceInternal::voidMemFun(&CollectorFactory::hold));
+ for_each(_collectorFactories.begin(), _collectorFactories.end(), Ice::voidMemFun(&CollectorFactory::hold));
}
void
@@ -84,16 +82,16 @@ Ice::ObjectAdapterI::deactivate()
return;
}
- for_each(_collectorFactories.begin(), _collectorFactories.end(),
- ::IceInternal::voidMemFun(&CollectorFactory::destroy));
+ for_each(_collectorFactories.begin(), _collectorFactories.end(), Ice::voidMemFun(&CollectorFactory::destroy));
_collectorFactories.clear();
+
_activeServantMap.clear();
- _activeServantMapHint = _activeServantMap.begin();
- if (_locator)
- {
- _locator->deactivate();
- _locator = 0;
- }
+ _activeServantMapHint = _activeServantMap.end();
+
+ for_each(_locatorMap.begin(), _locatorMap.end(),
+ secondVoidMemFun<string, ServantLocator>(&ServantLocator::deactivate));
+ _locatorMap.clear();
+ _locatorMapHint = _locatorMap.end();
}
ObjectPrx
@@ -149,21 +147,59 @@ Ice::ObjectAdapterI::remove(const string& ident)
}
_activeServantMap.erase(ident);
- _activeServantMapHint = _activeServantMap.begin();
+ _activeServantMapHint = _activeServantMap.end();
}
void
-Ice::ObjectAdapterI::setServantLocator(const ServantLocatorPtr& locator)
+Ice::ObjectAdapterI::addServantLocator(const ServantLocatorPtr& locator, const string& prefix)
{
JTCSyncT<JTCMutex> sync(*this);
- _locator = locator;
+
+ if (_collectorFactories.empty())
+ {
+ throw ObjectAdapterDeactivatedException(__FILE__, __LINE__);
+ }
+
+ _locatorMapHint = _locatorMap.insert(_locatorMapHint, make_pair(prefix, locator));
+}
+
+void
+Ice::ObjectAdapterI::removeServantLocator(const string& prefix)
+{
+ JTCSyncT<JTCMutex> sync(*this);
+
+ if (_collectorFactories.empty())
+ {
+ throw ObjectAdapterDeactivatedException(__FILE__, __LINE__);
+ }
+
+ _locatorMap.erase(prefix);
+ _locatorMapHint = _locatorMap.end();
}
ServantLocatorPtr
-Ice::ObjectAdapterI::getServantLocator()
+Ice::ObjectAdapterI::findServantLocator(const string& prefix)
{
JTCSyncT<JTCMutex> sync(*this);
- return _locator;
+
+ if (_locatorMapHint != _locatorMap.end())
+ {
+ if (_locatorMapHint->first == prefix)
+ {
+ return _locatorMapHint->second;
+ }
+ }
+
+ map<string, ::Ice::ServantLocatorPtr>::iterator p = _locatorMap.find(prefix);
+ if (p != _locatorMap.end())
+ {
+ _locatorMapHint = p;
+ return p->second;
+ }
+ else
+ {
+ return 0;
+ }
}
ObjectPtr
@@ -171,9 +207,18 @@ Ice::ObjectAdapterI::identityToServant(const string& ident)
{
JTCSyncT<JTCMutex> sync(*this);
- map<string, ObjectPtr>::const_iterator p = _activeServantMap.find(ident);
+ if (_activeServantMapHint != _activeServantMap.end())
+ {
+ if (_activeServantMapHint->first == ident)
+ {
+ return _activeServantMapHint->second;
+ }
+ }
+
+ map<string, ObjectPtr>::iterator p = _activeServantMap.find(ident);
if (p != _activeServantMap.end())
{
+ _activeServantMapHint = p;
return p->second;
}
else
@@ -205,7 +250,8 @@ Ice::ObjectAdapterI::createProxy(const string& ident)
Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const string& name, const string& endpts) :
_instance(instance),
_name(name),
- _activeServantMapHint(_activeServantMap.begin())
+ _activeServantMapHint(_activeServantMap.end()),
+ _locatorMapHint(_locatorMap.end())
{
string s(endpts);
transform(s.begin(), s.end(), s.begin(), tolower);
@@ -283,7 +329,7 @@ Ice::ObjectAdapterI::newProxy(const string& ident)
{
vector<EndpointPtr> endpoints;
transform(_collectorFactories.begin(), _collectorFactories.end(), back_inserter(endpoints),
- ::IceInternal::constMemFun(&CollectorFactory::endpoint));
+ Ice::constMemFun(&CollectorFactory::endpoint));
ReferencePtr reference = new Reference(_instance, ident, Reference::ModeTwoway, false, endpoints, endpoints);
return _instance->proxyFactory()->referenceToProxy(reference);
diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h
index 122f0a375f5..81233e4ed59 100644
--- a/cpp/src/Ice/ObjectAdapterI.h
+++ b/cpp/src/Ice/ObjectAdapterI.h
@@ -42,8 +42,9 @@ public:
virtual ObjectPrx addTemporary(const ObjectPtr&);
virtual void remove(const std::string&);
- virtual void setServantLocator(const ServantLocatorPtr&);
- virtual ServantLocatorPtr getServantLocator();
+ virtual void addServantLocator(const ServantLocatorPtr&, const std::string&);
+ virtual void removeServantLocator(const std::string&);
+ virtual ServantLocatorPtr findServantLocator(const std::string&);
virtual ObjectPtr identityToServant(const ::std::string&);
virtual ObjectPtr proxyToServant(const ObjectPrx&);
@@ -64,7 +65,8 @@ private:
std::vector< IceInternal::CollectorFactoryPtr> _collectorFactories;
std::map<std::string, ObjectPtr> _activeServantMap;
std::map<std::string, ObjectPtr>::iterator _activeServantMapHint;
- ServantLocatorPtr _locator;
+ std::map<std::string, ServantLocatorPtr> _locatorMap;
+ std::map<std::string, ServantLocatorPtr>::iterator _locatorMapHint;
};
}
diff --git a/cpp/src/Ice/Proxy.cpp b/cpp/src/Ice/Proxy.cpp
index 2ef08373d0f..d0b87ebcfc9 100644
--- a/cpp/src/Ice/Proxy.cpp
+++ b/cpp/src/Ice/Proxy.cpp
@@ -517,7 +517,7 @@ IceDelegateM::Ice::Object::setup(const ReferencePtr& ref)
case Reference::ModeBatchOneway:
{
remove_copy_if(__reference->endpoints.begin(), __reference->endpoints.end(), back_inserter(endpoints),
- ::IceInternal::constMemFun(&Endpoint::datagram));
+ ::Ice::constMemFun(&Endpoint::datagram));
break;
}
@@ -525,21 +525,19 @@ IceDelegateM::Ice::Object::setup(const ReferencePtr& ref)
case Reference::ModeBatchDatagram:
{
remove_copy_if(__reference->endpoints.begin(), __reference->endpoints.end(), back_inserter(endpoints),
- not1(::IceInternal::constMemFun(&Endpoint::datagram)));
+ not1(::Ice::constMemFun(&Endpoint::datagram)));
break;
}
}
if (__reference->secure)
{
- endpoints.erase(remove_if(endpoints.begin(), endpoints.end(),
- not1(::IceInternal::constMemFun(&Endpoint::secure))),
+ endpoints.erase(remove_if(endpoints.begin(), endpoints.end(), not1(::Ice::constMemFun(&Endpoint::secure))),
endpoints.end());
}
else
{
- endpoints.erase(remove_if(endpoints.begin(), endpoints.end(),
- ::IceInternal::constMemFun(&Endpoint::secure)),
+ endpoints.erase(remove_if(endpoints.begin(), endpoints.end(), ::Ice::constMemFun(&Endpoint::secure)),
endpoints.end());
}
diff --git a/cpp/src/Ice/ServantFactoryManager.cpp b/cpp/src/Ice/ServantFactoryManager.cpp
index 91c01f4f0c2..d1f0372f5a6 100644
--- a/cpp/src/Ice/ServantFactoryManager.cpp
+++ b/cpp/src/Ice/ServantFactoryManager.cpp
@@ -10,6 +10,7 @@
#include <Ice/ServantFactoryManager.h>
#include <Ice/ServantFactory.h>
+#include <Ice/Functional.h>
using namespace std;
using namespace Ice;
@@ -19,20 +20,37 @@ void IceInternal::incRef(ServantFactoryManager* p) { p->__incRef(); }
void IceInternal::decRef(ServantFactoryManager* p) { p->__decRef(); }
void
-IceInternal::ServantFactoryManager::install(const ServantFactoryPtr& factory, const string& id)
+IceInternal::ServantFactoryManager::add(const ServantFactoryPtr& factory, const string& id)
{
JTCSyncT<JTCMutex> sync(*this);
- _factories.insert(make_pair(id, factory));
+ _factoryMapHint = _factoryMap.insert(_factoryMapHint, make_pair(id, factory));
+}
+
+void
+IceInternal::ServantFactoryManager::remove(const string& id)
+{
+ JTCSyncT<JTCMutex> sync(*this);
+ _factoryMap.erase(id);
+ _factoryMapHint = _factoryMap.end();
}
ServantFactoryPtr
-IceInternal::ServantFactoryManager::lookup(const string& id)
+IceInternal::ServantFactoryManager::find(const string& id)
{
JTCSyncT<JTCMutex> sync(*this);
- map<string, ::Ice::ServantFactoryPtr>::const_iterator p;
- p = _factories.find(id);
- if (p != _factories.end())
+
+ if (_factoryMapHint != _factoryMap.end())
{
+ if (_factoryMapHint->first == id)
+ {
+ return _factoryMapHint->second;
+ }
+ }
+
+ map<string, ::Ice::ServantFactoryPtr>::iterator p = _factoryMap.find(id);
+ if (p != _factoryMap.end())
+ {
+ _factoryMapHint = p;
return p->second;
}
else
@@ -41,7 +59,8 @@ IceInternal::ServantFactoryManager::lookup(const string& id)
}
}
-IceInternal::ServantFactoryManager::ServantFactoryManager()
+IceInternal::ServantFactoryManager::ServantFactoryManager() :
+ _factoryMapHint(_factoryMap.end())
{
}
@@ -49,9 +68,8 @@ void
IceInternal::ServantFactoryManager::destroy()
{
JTCSyncT<JTCMutex> sync(*this);
- for (map<string, ::Ice::ServantFactoryPtr>::iterator p = _factories.begin(); p != _factories.end(); ++p)
- {
- p->second->destroy();
- }
- _factories.clear();
+ for_each(_factoryMap.begin(), _factoryMap.end(),
+ secondVoidMemFun<string, ServantFactory>(&ServantFactory::destroy));
+ _factoryMap.clear();
+ _factoryMapHint = _factoryMap.end();
}
diff --git a/cpp/src/Ice/ServantFactoryManager.h b/cpp/src/Ice/ServantFactoryManager.h
index b738878405f..de1a3716129 100644
--- a/cpp/src/Ice/ServantFactoryManager.h
+++ b/cpp/src/Ice/ServantFactoryManager.h
@@ -22,8 +22,9 @@ class ServantFactoryManager : public ::IceUtil::Shared, public JTCMutex
{
public:
- void install(const ::Ice::ServantFactoryPtr&, const std::string&);
- ::Ice::ServantFactoryPtr lookup(const std::string&);
+ void add(const ::Ice::ServantFactoryPtr&, const std::string&);
+ void remove(const std::string&);
+ ::Ice::ServantFactoryPtr find(const std::string&);
private:
@@ -31,7 +32,8 @@ private:
void destroy();
friend class Instance;
- std::map<std::string, ::Ice::ServantFactoryPtr> _factories;
+ std::map<std::string, ::Ice::ServantFactoryPtr> _factoryMap;
+ std::map<std::string, ::Ice::ServantFactoryPtr>::iterator _factoryMapHint;
};
}
diff --git a/cpp/src/Ice/Stream.cpp b/cpp/src/Ice/Stream.cpp
index cf3b50a53ef..112c561bc5c 100644
--- a/cpp/src/Ice/Stream.cpp
+++ b/cpp/src/Ice/Stream.cpp
@@ -820,7 +820,7 @@ IceInternal::Stream::read(ObjectPtr& v, const string& type)
vector<string>::const_iterator p;
for (p = classIds.begin(); p != classIds.end(); ++p)
{
- ServantFactoryPtr factory = _instance->servantFactoryManager()->lookup(*p);
+ ServantFactoryPtr factory = _instance->servantFactoryManager()->find(*p);
if (factory)
{
diff --git a/cpp/src/IcePack/Server.cpp b/cpp/src/IcePack/Server.cpp
index 0af2b57fec3..18c350d0b54 100644
--- a/cpp/src/IcePack/Server.cpp
+++ b/cpp/src/IcePack/Server.cpp
@@ -85,7 +85,7 @@ run(int argc, char* argv[], const CommunicatorPtr& communicator)
}
ObjectAdapterPtr forwardAdapter = communicator->createObjectAdapter("Forward");
- forwardAdapter->setServantLocator(forward);
+ forwardAdapter->addServantLocator(forward, "");
forwardAdapter->activate();
communicator->waitForShutdown();