diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.cpp | 24 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.h | 1 |
2 files changed, 14 insertions, 11 deletions
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp index 3f8d806b662..a8b37763a34 100644 --- a/cpp/src/Ice/ObjectAdapterI.cpp +++ b/cpp/src/Ice/ObjectAdapterI.cpp @@ -344,10 +344,14 @@ Ice::ObjectAdapterI::addRouter(const RouterPrx& router) // adapter. // ObjectPrx proxy = routerInfo->getServerProxy(); - copy(proxy->__reference()->endpoints.begin(), proxy->__reference()->endpoints.end(), - back_inserter(_routerEndpoints)); - sort(_routerEndpoints.begin(), _routerEndpoints.end()); // Must be sorted. - _routerEndpoints.erase(unique(_routerEndpoints.begin(), _routerEndpoints.end()), _routerEndpoints.end()); + + { + IceUtil::Mutex::Lock routerEndpointsSync(_routerEndpointsMutex); + copy(proxy->__reference()->endpoints.begin(), proxy->__reference()->endpoints.end(), + back_inserter(_routerEndpoints)); + sort(_routerEndpoints.begin(), _routerEndpoints.end()); // Must be sorted. + _routerEndpoints.erase(unique(_routerEndpoints.begin(), _routerEndpoints.end()), _routerEndpoints.end()); + } // // Associate this object adapter with the router. This way, @@ -482,7 +486,10 @@ Ice::ObjectAdapterI::newProxy(const Identity& ident) const // any. This way, object references created by this object adapter // will also point to the router's server proxy endpoints. // - copy(_routerEndpoints.begin(), _routerEndpoints.end(), back_inserter(endpoints)); + { + IceUtil::Mutex::Lock routerEndpointsSync(_routerEndpointsMutex); + copy(_routerEndpoints.begin(), _routerEndpoints.end(), back_inserter(endpoints)); + } // // Create a reference and return a proxy for this reference. @@ -515,13 +522,8 @@ Ice::ObjectAdapterI::isLocal(const ObjectPrx& proxy) const } } - // - // Must be synchronized, because _routerEndpoints is not - // immutable, and because this operation is called unsynchronized - // from ObjectAdapterFactory::findObjectAdapter(). - // { - IceUtil::Mutex::Lock sync(*this); + IceUtil::Mutex::Lock routerEndpointsSync(_routerEndpointsMutex); // // Proxies which have at least one endpoint in common with the diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h index 25ce7b13666..de00f2855d5 100644 --- a/cpp/src/Ice/ObjectAdapterI.h +++ b/cpp/src/Ice/ObjectAdapterI.h @@ -79,6 +79,7 @@ private: std::map<std::string, ServantLocatorPtr>::iterator _locatorMapHint; std::vector< ::IceInternal::IncomingConnectionFactoryPtr> _incomingConnectionFactories; std::vector< ::IceInternal::EndpointPtr> _routerEndpoints; + IceUtil::Mutex _routerEndpointsMutex; }; } |