From fdadca3f4782c4fcc71ab86b091503855447e485 Mon Sep 17 00:00:00 2001 From: Benoit Foucher Date: Wed, 1 Aug 2012 09:19:38 +0200 Subject: Fixes --- cpp/src/Ice/ConnectionFactory.cpp | 52 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) (limited to 'cpp/src/Ice/ConnectionFactory.cpp') diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp index 1508e3cc911..f74bad05545 100755 --- a/cpp/src/Ice/ConnectionFactory.cpp +++ b/cpp/src/Ice/ConnectionFactory.cpp @@ -24,11 +24,13 @@ #include #include #include +#include #include #include using namespace std; using namespace Ice; +using namespace Ice::Instrumentation; using namespace IceInternal; IceUtil::Shared* IceInternal::upCast(OutgoingConnectionFactory* p) { return p; } @@ -250,14 +252,30 @@ IceInternal::OutgoingConnectionFactory::create(const vector& endpt // Try to establish the connection to the connectors. // DefaultsAndOverridesPtr defaultsAndOverrides = _instance->defaultsAndOverrides(); + const ObserverResolverPtr& resolver = _instance->initializationData().observerResolver; vector::const_iterator q; for(q = connectors.begin(); q != connectors.end(); ++q) { + ObserverPtr observer; + if(resolver) + { + observer = resolver->getConnectObserver(q->endpoint->getInfo(), q->connector->toString()); + if(observer) + { + observer->attach(); + } + } + try { connection = createConnection(q->connector->connect(), *q); connection->start(0); + if(observer) + { + observer->detach(); + } + if(defaultsAndOverrides->overrideCompress) { compress = defaultsAndOverrides->overrideCompressValue; @@ -272,6 +290,11 @@ IceInternal::OutgoingConnectionFactory::create(const vector& endpt } catch(const Ice::CommunicatorDestroyedException& ex) { + if(observer) + { + observer->failed(ex.ice_name()); + observer->detach(); + } exception.reset(dynamic_cast(ex.ice_clone())); handleConnectionException(*exception.get(), hasMore || q != connectors.end() - 1); connection = 0; @@ -279,6 +302,11 @@ IceInternal::OutgoingConnectionFactory::create(const vector& endpt } catch(const Ice::LocalException& ex) { + if(observer) + { + observer->failed(ex.ice_name()); + observer->detach(); + } exception.reset(dynamic_cast(ex.ice_clone())); handleConnectionException(*exception.get(), hasMore || q != connectors.end() - 1); connection = 0; @@ -963,6 +991,11 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::ConnectCallback(const O void IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartCompleted(const ConnectionIPtr& connection) { + if(_observer) + { + _observer->detach(); + } + connection->activate(); _factory->finishGetConnection(_connectors, *_iter, connection, this); } @@ -972,6 +1005,12 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartFailed(c const LocalException& ex) { assert(_iter != _connectors.end()); + + if(_observer) + { + _observer->failed(ex.ice_name()); + _observer->detach(); + } _factory->handleConnectionException(ex, _hasMore || _iter != _connectors.end() - 1); if(dynamic_cast(&ex)) // No need to continue. @@ -1120,6 +1159,17 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::nextConnector() Ice::ConnectionIPtr connection; try { + + const ObserverResolverPtr& resolver = _factory->_instance->initializationData().observerResolver; + if(resolver) + { + _observer = resolver->getConnectObserver(_iter->endpoint->getInfo(), _iter->connector->toString()); + if(_observer) + { + _observer->attach(); + } + } + assert(_iter != _connectors.end()); connection = _factory->createConnection(_iter->connector->connect(), *_iter); connection->start(this); @@ -1526,7 +1576,7 @@ IceInternal::IncomingConnectionFactory::connectionStartFailed(const Ice::Connect { return; } - + if(_warn) { Warning out(_instance->initializationData().logger); -- cgit v1.2.3