diff options
Diffstat (limited to 'cpp/src/IcePack/NodeRegistryI.cpp')
-rw-r--r-- | cpp/src/IcePack/NodeRegistryI.cpp | 78 |
1 files changed, 44 insertions, 34 deletions
diff --git a/cpp/src/IcePack/NodeRegistryI.cpp b/cpp/src/IcePack/NodeRegistryI.cpp index 5d2d5827274..b75fb2290d0 100644 --- a/cpp/src/IcePack/NodeRegistryI.cpp +++ b/cpp/src/IcePack/NodeRegistryI.cpp @@ -15,20 +15,20 @@ using namespace std; using namespace IcePack; -IcePack::NodeRegistryI::NodeRegistryI(const Ice::CommunicatorPtr& communicator, - const string& envName, - const string& dbName, - const AdapterRegistryPtr& adapterRegistry, - const AdapterFactoryPtr& adapterFactory, - const TraceLevelsPtr& traceLevels) : +const string NodeRegistryI::_dbName = "noderegistry"; + +NodeRegistryI::NodeRegistryI(const Ice::CommunicatorPtr& communicator, + const string& envName, + const AdapterRegistryPtr& adapterRegistry, + const AdapterFactoryPtr& adapterFactory, + const TraceLevelsPtr& traceLevels) : _connectionCache(Freeze::createConnection(communicator, envName)), - _dictCache(_connectionCache, dbName), + _dictCache(_connectionCache, _dbName), _adapterRegistry(adapterRegistry), _adapterFactory(adapterFactory), _traceLevels(traceLevels), _envName(envName), - _communicator(communicator), - _dbName(dbName) + _communicator(communicator) { for(StringObjectProxyDict::iterator p = _dictCache.begin(); p != _dictCache.end(); ++p) { @@ -48,7 +48,7 @@ IcePack::NodeRegistryI::NodeRegistryI(const Ice::CommunicatorPtr& communicator, } void -IcePack::NodeRegistryI::add(const string& name, const NodePrx& node, const Ice::Current& current) +NodeRegistryI::add(const string& name, const NodePrx& node, const Ice::Current& current) { while(true) { @@ -101,36 +101,46 @@ IcePack::NodeRegistryI::add(const string& name, const NodePrx& node, const Ice:: break; } - try - { - _adapterRegistry->findById("IcePack.Node." + name); - - // - // TODO: ensure this adapter has been created by the adapter factory. It's possible that an - // adapter has been created with the same name. In such a case, the best is probably to - // prevent the node registration by throwing an appropriate exception. The user would then - // need to remove the adapter from the adapter registry to be able to run the node. - // - } - catch(const AdapterNotExistException&) + AdapterPrx adapter; + while(!adapter) { - // - // Create and register the node adapter. - // - AdapterPrx adapter = _adapterFactory->createStandaloneAdapter("IcePackNodeAdapter." + name); try { - _adapterRegistry->add("IcePack.Node." + name, adapter); - } - catch(const AdapterExistsException&) + adapter = _adapterRegistry->findById("IcePack.Node." + name); + + // + // TODO: ensure this adapter has been created by the adapter factory. It's possible that an + // adapter has been created with the same name. In such a case, the best is probably to + // prevent the node registration by throwing an appropriate exception. The user would then + // need to remove the adapter from the adapter registry to be able to run the node. + // + } + catch(const AdapterNotExistException&) { - adapter->destroy(); + // + // Create and register the node adapter. + // + adapter = _adapterFactory->createStandaloneAdapter("IcePackNodeAdapter." + name); + try + { + _adapterRegistry->add("IcePack.Node." + name, adapter); + } + catch(const AdapterExistsException&) + { + adapter->destroy(); + adapter = 0; + } } } + + // + // Set the direct proxy of the node object adapter. + // + adapter->setDirectProxy(node); } void -IcePack::NodeRegistryI::remove(const string& name, const Ice::Current&) +NodeRegistryI::remove(const string& name, const Ice::Current&) { IceUtil::Mutex::Lock sync(*this); @@ -158,7 +168,7 @@ IcePack::NodeRegistryI::remove(const string& name, const Ice::Current&) { AdapterPrx adapter = _adapterRegistry->findById("IcePack.Node." + name); adapter->destroy(); - _adapterRegistry->remove("IcePack.Node." + name); + _adapterRegistry->remove("IcePack.Node." + name, 0); } catch(const AdapterNotExistException&) { @@ -166,7 +176,7 @@ IcePack::NodeRegistryI::remove(const string& name, const Ice::Current&) } NodePrx -IcePack::NodeRegistryI::findByName(const string& name, const Ice::Current&) +NodeRegistryI::findByName(const string& name, const Ice::Current&) { Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); StringObjectProxyDict dict(connection, _dbName); @@ -190,7 +200,7 @@ IcePack::NodeRegistryI::findByName(const string& name, const Ice::Current&) } Ice::StringSeq -IcePack::NodeRegistryI::getAll(const Ice::Current&) const +NodeRegistryI::getAll(const Ice::Current&) const { Freeze::ConnectionPtr connection = Freeze::createConnection(_communicator, _envName); StringObjectProxyDict dict(connection, _dbName); |