summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/CommunicatorI.cpp22
-rw-r--r--cpp/src/Ice/ObjectAdapterFactory.cpp2
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);