diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/CommunicatorI.cpp | 22 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterFactory.cpp | 2 |
2 files changed, 21 insertions, 3 deletions
diff --git a/cpp/src/Ice/CommunicatorI.cpp b/cpp/src/Ice/CommunicatorI.cpp index 26aac982931..b5de2d989d6 100644 --- a/cpp/src/Ice/CommunicatorI.cpp +++ b/cpp/src/Ice/CommunicatorI.cpp @@ -207,8 +207,26 @@ Ice::CommunicatorI::createObjectAdapter(const string& name) ObjectAdapterPtr Ice::CommunicatorI::createObjectAdapterWithEndpoints(const string& name, const string& endpoints) { - getProperties()->setProperty(name + ".Endpoints", endpoints); - return createObjectAdapter(name); + // + // The createObjectAdapter() call may throw, so we keep track of + // endpoint properties that already exist so we can revert the + // properties to their original value. + // + const string propertyKey = name + ".Endpoints"; + const string originalValue = getProperties()->getProperty(propertyKey); + try + { + getProperties()->setProperty(propertyKey, endpoints); + return createObjectAdapter(name); + } + catch(const AlreadyRegisteredException&) + { + if(originalValue.length() != 0) + { + getProperties()->setProperty(propertyKey, originalValue); + } + throw; + } } void diff --git a/cpp/src/Ice/ObjectAdapterFactory.cpp b/cpp/src/Ice/ObjectAdapterFactory.cpp index e041e5e2107..9bcd0e6580b 100644 --- a/cpp/src/Ice/ObjectAdapterFactory.cpp +++ b/cpp/src/Ice/ObjectAdapterFactory.cpp @@ -112,7 +112,7 @@ IceInternal::ObjectAdapterFactory::createObjectAdapter(const string& name) map<string, ObjectAdapterIPtr>::iterator p = _adapters.find(name); if(p != _adapters.end()) { - return p->second; + throw AlreadyRegisteredException(__FILE__, __LINE__, "object adapter", name); } ObjectAdapterIPtr adapter = new ObjectAdapterI(_instance, _communicator, name); |