diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/.depend | 2 | ||||
-rw-r--r-- | cpp/src/Ice/Collector.cpp | 9 | ||||
-rw-r--r-- | cpp/src/Ice/CommunicatorI.cpp | 26 | ||||
-rw-r--r-- | cpp/src/Ice/CommunicatorI.h | 4 | ||||
-rw-r--r-- | cpp/src/Ice/Direct.cpp | 11 | ||||
-rw-r--r-- | cpp/src/Ice/Incoming.cpp | 11 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.cpp | 86 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.h | 8 | ||||
-rw-r--r-- | cpp/src/Ice/Proxy.cpp | 10 | ||||
-rw-r--r-- | cpp/src/Ice/ServantFactoryManager.cpp | 42 | ||||
-rw-r--r-- | cpp/src/Ice/ServantFactoryManager.h | 8 | ||||
-rw-r--r-- | cpp/src/Ice/Stream.cpp | 2 | ||||
-rw-r--r-- | cpp/src/IcePack/Server.cpp | 2 |
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(); |