summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/ObjectAdapterFactory.cpp25
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp9
2 files changed, 23 insertions, 11 deletions
diff --git a/cpp/src/Ice/ObjectAdapterFactory.cpp b/cpp/src/Ice/ObjectAdapterFactory.cpp
index 73fe10723b6..5ec4f2f0fb0 100644
--- a/cpp/src/Ice/ObjectAdapterFactory.cpp
+++ b/cpp/src/Ice/ObjectAdapterFactory.cpp
@@ -55,6 +55,8 @@ IceInternal::ObjectAdapterFactory::shutdown()
void
IceInternal::ObjectAdapterFactory::waitForShutdown()
{
+ map<string, ObjectAdapterIPtr> adapters;
+
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
@@ -80,7 +82,7 @@ IceInternal::ObjectAdapterFactory::waitForShutdown()
//
// Now we wait for deactivation of each object adapter.
//
- for_each(_adapters.begin(), _adapters.end(),
+ for_each(adapters.begin(), adapters.end(),
IceUtil::secondVoidMemFun<const string, ObjectAdapterI>(&ObjectAdapter::waitForDeactivate));
{
@@ -114,9 +116,7 @@ IceInternal::ObjectAdapterFactory::destroy()
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
-
- adapters = _adapters;
- _adapters.clear();
+ adapters.swap(_adapters);
}
//
@@ -168,14 +168,19 @@ IceInternal::ObjectAdapterFactory::createObjectAdapter(const string& name, const
ObjectAdapterPtr
IceInternal::ObjectAdapterFactory::findObjectAdapter(const ObjectPrx& proxy)
{
- IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
-
- if(!_instance)
+ map<string, ObjectAdapterIPtr> adapters;
{
- return 0;
+ IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
+
+ if(!_instance)
+ {
+ return 0;
+ }
+
+ adapters = _adapters;
}
- for(map<string, ObjectAdapterIPtr>::iterator p = _adapters.begin(); p != _adapters.end(); ++p)
+ for(map<string, ObjectAdapterIPtr>::iterator p = adapters.begin(); p != adapters.end(); ++p)
{
try
{
@@ -198,7 +203,7 @@ IceInternal::ObjectAdapterFactory::removeObjectAdapter(const string& name)
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
- if(_waitForShutdown)
+ if(!_instance)
{
return;
}
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index b02cf0a9ef5..3de824796c8 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -643,7 +643,14 @@ Ice::ObjectAdapterI::isLocal(const ObjectPrx& proxy) const
if(info)
{
bool isCached;
- endpoints = info->getEndpoints(ir, ir->getLocatorCacheTimeout(), isCached);
+ try
+ {
+ endpoints = info->getEndpoints(ir, ir->getLocatorCacheTimeout(), isCached);
+ }
+ catch(const Ice::LocalException&)
+ {
+ return false;
+ }
}
else
{