diff options
author | Benoit Foucher <benoit@zeroc.com> | 2012-10-08 15:03:46 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2012-10-08 15:03:46 +0200 |
commit | d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae (patch) | |
tree | 7abffd29e98ff112cec85b658fab404961f8306a /cpp/src/Ice/EndpointI.cpp | |
parent | FreeBSD port (diff) | |
parent | Win32 fixes (diff) | |
download | ice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.tar.bz2 ice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.tar.xz ice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.zip |
Merge branch 'mx' into encoding11
Conflicts:
cpp/demo/Freeze/backup/.depend
cpp/demo/Freeze/backup/.depend.mak
cpp/demo/Freeze/bench/.depend
cpp/demo/Freeze/bench/.depend.mak
cpp/demo/Freeze/casino/.depend
cpp/demo/Freeze/casino/.depend.mak
cpp/demo/Freeze/customEvictor/.depend
cpp/demo/Freeze/customEvictor/.depend.mak
cpp/demo/Freeze/library/.depend
cpp/demo/Freeze/library/.depend.mak
cpp/demo/Freeze/phonebook/.depend
cpp/demo/Freeze/phonebook/.depend.mak
cpp/demo/Freeze/transform/.depend
cpp/demo/Freeze/transform/.depend.mak
cpp/demo/Glacier2/callback/.depend
cpp/demo/Glacier2/callback/.depend.mak
cpp/demo/Glacier2/chat/.depend
cpp/demo/Glacier2/chat/.depend.mak
cpp/demo/Ice/async/.depend
cpp/demo/Ice/async/.depend.mak
cpp/demo/Ice/bidir/.depend
cpp/demo/Ice/bidir/.depend.mak
cpp/demo/Ice/callback/.depend
cpp/demo/Ice/callback/.depend.mak
cpp/demo/Ice/converter/.depend
cpp/demo/Ice/converter/.depend.mak
cpp/demo/Ice/hello/.depend
cpp/demo/Ice/hello/.depend.mak
cpp/demo/Ice/interleaved/.depend
cpp/demo/Ice/interleaved/.depend.mak
cpp/demo/Ice/invoke/.depend
cpp/demo/Ice/invoke/.depend.mak
cpp/demo/Ice/latency/.depend
cpp/demo/Ice/latency/.depend.mak
cpp/demo/Ice/minimal/.depend
cpp/demo/Ice/minimal/.depend.mak
cpp/demo/Ice/multicast/.depend
cpp/demo/Ice/multicast/.depend.mak
cpp/demo/Ice/nested/.depend
cpp/demo/Ice/nested/.depend.mak
cpp/demo/Ice/nrvo/.depend
cpp/demo/Ice/nrvo/.depend.mak
cpp/demo/Ice/plugin/.depend
cpp/demo/Ice/plugin/.depend.mak
cpp/demo/Ice/session/.depend
cpp/demo/Ice/session/.depend.mak
cpp/demo/Ice/throughput/.depend
cpp/demo/Ice/throughput/.depend.mak
cpp/demo/Ice/value/.depend
cpp/demo/Ice/value/.depend.mak
cpp/demo/IceBox/hello/.depend
cpp/demo/IceBox/hello/.depend.mak
cpp/demo/IceGrid/allocate/.depend
cpp/demo/IceGrid/allocate/.depend.mak
cpp/demo/IceGrid/icebox/.depend
cpp/demo/IceGrid/icebox/.depend.mak
cpp/demo/IceGrid/replication/.depend
cpp/demo/IceGrid/replication/.depend.mak
cpp/demo/IceGrid/secure/.depend
cpp/demo/IceGrid/secure/.depend.mak
cpp/demo/IceGrid/sessionActivation/.depend
cpp/demo/IceGrid/sessionActivation/.depend.mak
cpp/demo/IceGrid/simple/.depend
cpp/demo/IceGrid/simple/.depend.mak
cpp/demo/IceStorm/clock/.depend
cpp/demo/IceStorm/clock/.depend.mak
cpp/demo/IceStorm/counter/.depend
cpp/demo/IceStorm/counter/.depend.mak
cpp/demo/IceStorm/replicated/.depend
cpp/demo/IceStorm/replicated/.depend.mak
cpp/demo/IceStorm/replicated2/.depend
cpp/demo/IceStorm/replicated2/.depend.mak
cpp/demo/book/evictor_filesystem/.depend
cpp/demo/book/evictor_filesystem/.depend.mak
cpp/demo/book/lifecycle/.depend
cpp/demo/book/lifecycle/.depend.mak
cpp/demo/book/map_filesystem/.depend
cpp/demo/book/map_filesystem/.depend.mak
cpp/demo/book/printer/.depend
cpp/demo/book/printer/.depend.mak
cpp/demo/book/simple_filesystem/.depend
cpp/demo/book/simple_filesystem/.depend.mak
cpp/include/Ice/Outgoing.h
cpp/include/Ice/OutgoingAsync.h
cpp/include/Ice/StreamTraits.h
cpp/src/Freeze/.depend
cpp/src/Freeze/.depend.mak
cpp/src/FreezeScript/.depend
cpp/src/FreezeScript/.depend.mak
cpp/src/Glacier2/.depend
cpp/src/Glacier2/.depend.mak
cpp/src/Glacier2Lib/.depend
cpp/src/Glacier2Lib/.depend.mak
cpp/src/Ice/.depend
cpp/src/Ice/.depend.mak
cpp/src/IceBox/.depend
cpp/src/IceBox/.depend.mak
cpp/src/IceDB/.depend
cpp/src/IceDB/.depend.mak
cpp/src/IceGrid/.depend
cpp/src/IceGrid/.depend.mak
cpp/src/IceGrid/FreezeDB/.depend
cpp/src/IceGrid/FreezeDB/.depend.mak
cpp/src/IceGrid/ServerCache.h
cpp/src/IceGrid/ServerI.h
cpp/src/IceGridLib/.depend
cpp/src/IceGridLib/.depend.mak
cpp/src/IcePatch2/.depend
cpp/src/IcePatch2/.depend.mak
cpp/src/IcePatch2Lib/.depend
cpp/src/IcePatch2Lib/.depend.mak
cpp/src/IceSSL/.depend
cpp/src/IceSSL/.depend.mak
cpp/src/IceStorm/.depend
cpp/src/IceStorm/.depend.mak
cpp/src/IceStorm/FreezeDB/.depend
cpp/src/IceStorm/FreezeDB/.depend.mak
cpp/src/IceStormLib/.depend
cpp/src/IceStormLib/.depend.mak
cpp/src/slice2cpp/Gen.cpp
cpp/test/Freeze/complex/.depend
cpp/test/Freeze/complex/.depend.mak
cpp/test/Freeze/dbmap/.depend
cpp/test/Freeze/dbmap/.depend.mak
cpp/test/Freeze/evictor/.depend
cpp/test/Freeze/evictor/.depend.mak
cpp/test/Freeze/fileLock/.depend
cpp/test/Freeze/fileLock/.depend.mak
cpp/test/FreezeScript/dbmap/.depend
cpp/test/FreezeScript/dbmap/.depend.mak
cpp/test/FreezeScript/evictor/.depend
cpp/test/FreezeScript/evictor/.depend.mak
cpp/test/Glacier2/attack/.depend
cpp/test/Glacier2/attack/.depend.mak
cpp/test/Glacier2/dynamicFiltering/.depend
cpp/test/Glacier2/dynamicFiltering/.depend.mak
cpp/test/Glacier2/override/.depend
cpp/test/Glacier2/override/.depend.mak
cpp/test/Glacier2/router/.depend
cpp/test/Glacier2/router/.depend.mak
cpp/test/Glacier2/sessionControl/.depend
cpp/test/Glacier2/sessionControl/.depend.mak
cpp/test/Glacier2/sessionHelper/.depend
cpp/test/Glacier2/sessionHelper/.depend.mak
cpp/test/Glacier2/ssl/.depend
cpp/test/Glacier2/ssl/.depend.mak
cpp/test/Glacier2/staticFiltering/.depend
cpp/test/Glacier2/staticFiltering/.depend.mak
cpp/test/Ice/adapterDeactivation/.depend
cpp/test/Ice/adapterDeactivation/.depend.mak
cpp/test/Ice/ami/.depend
cpp/test/Ice/ami/.depend.mak
cpp/test/Ice/background/.depend
cpp/test/Ice/background/.depend.mak
cpp/test/Ice/binding/.depend
cpp/test/Ice/binding/.depend.mak
cpp/test/Ice/checksum/.depend
cpp/test/Ice/checksum/.depend.mak
cpp/test/Ice/checksum/server/.depend
cpp/test/Ice/checksum/server/.depend.mak
cpp/test/Ice/custom/.depend
cpp/test/Ice/custom/.depend.mak
cpp/test/Ice/defaultServant/.depend
cpp/test/Ice/defaultServant/.depend.mak
cpp/test/Ice/defaultValue/.depend
cpp/test/Ice/defaultValue/.depend.mak
cpp/test/Ice/dispatcher/.depend
cpp/test/Ice/dispatcher/.depend.mak
cpp/test/Ice/exceptions/.depend
cpp/test/Ice/exceptions/.depend.mak
cpp/test/Ice/facets/.depend
cpp/test/Ice/facets/.depend.mak
cpp/test/Ice/faultTolerance/.depend
cpp/test/Ice/faultTolerance/.depend.mak
cpp/test/Ice/gc/.depend
cpp/test/Ice/gc/.depend.mak
cpp/test/Ice/hash/.depend
cpp/test/Ice/hash/.depend.mak
cpp/test/Ice/hold/.depend
cpp/test/Ice/hold/.depend.mak
cpp/test/Ice/info/.depend
cpp/test/Ice/info/.depend.mak
cpp/test/Ice/inheritance/.depend
cpp/test/Ice/inheritance/.depend.mak
cpp/test/Ice/interceptor/.depend
cpp/test/Ice/interceptor/.depend.mak
cpp/test/Ice/invoke/.depend
cpp/test/Ice/invoke/.depend.mak
cpp/test/Ice/location/.depend
cpp/test/Ice/location/.depend.mak
cpp/test/Ice/objects/.depend
cpp/test/Ice/objects/.depend.mak
cpp/test/Ice/operations/.depend
cpp/test/Ice/operations/.depend.mak
cpp/test/Ice/plugin/.depend
cpp/test/Ice/plugin/.depend.mak
cpp/test/Ice/properties/.depend
cpp/test/Ice/properties/.depend.mak
cpp/test/Ice/proxy/.depend
cpp/test/Ice/proxy/.depend.mak
cpp/test/Ice/retry/.depend
cpp/test/Ice/retry/.depend.mak
cpp/test/Ice/servantLocator/.depend
cpp/test/Ice/servantLocator/.depend.mak
cpp/test/Ice/slicing/exceptions/.depend
cpp/test/Ice/slicing/exceptions/.depend.mak
cpp/test/Ice/slicing/objects/.depend
cpp/test/Ice/slicing/objects/.depend.mak
cpp/test/Ice/stream/.depend
cpp/test/Ice/stream/.depend.mak
cpp/test/Ice/stringConverter/.depend
cpp/test/Ice/stringConverter/.depend.mak
cpp/test/Ice/threadPoolPriority/.depend
cpp/test/Ice/threadPoolPriority/.depend.mak
cpp/test/Ice/timeout/.depend
cpp/test/Ice/timeout/.depend.mak
cpp/test/Ice/udp/.depend
cpp/test/Ice/udp/.depend.mak
cpp/test/IceBox/configuration/.depend
cpp/test/IceBox/configuration/.depend.mak
cpp/test/IceGrid/activation/.depend
cpp/test/IceGrid/activation/.depend.mak
cpp/test/IceGrid/admin/.depend
cpp/test/IceGrid/admin/.depend.mak
cpp/test/IceGrid/allocation/.depend
cpp/test/IceGrid/allocation/.depend.mak
cpp/test/IceGrid/deployer/.depend
cpp/test/IceGrid/deployer/.depend.mak
cpp/test/IceGrid/distribution/.depend
cpp/test/IceGrid/distribution/.depend.mak
cpp/test/IceGrid/replicaGroup/.depend
cpp/test/IceGrid/replicaGroup/.depend.mak
cpp/test/IceGrid/replication/.depend
cpp/test/IceGrid/replication/.depend.mak
cpp/test/IceGrid/session/.depend
cpp/test/IceGrid/session/.depend.mak
cpp/test/IceGrid/simple/.depend
cpp/test/IceGrid/simple/.depend.mak
cpp/test/IceGrid/update/.depend
cpp/test/IceGrid/update/.depend.mak
cpp/test/IceSSL/configuration/.depend
cpp/test/IceSSL/configuration/.depend.mak
cpp/test/IceStorm/federation/.depend
cpp/test/IceStorm/federation/.depend.mak
cpp/test/IceStorm/federation2/.depend
cpp/test/IceStorm/federation2/.depend.mak
cpp/test/IceStorm/rep1/.depend
cpp/test/IceStorm/rep1/.depend.mak
cpp/test/IceStorm/repgrid/.depend
cpp/test/IceStorm/repgrid/.depend.mak
cpp/test/IceStorm/repstress/.depend
cpp/test/IceStorm/repstress/.depend.mak
cpp/test/IceStorm/single/.depend
cpp/test/IceStorm/single/.depend.mak
cpp/test/IceStorm/stress/.depend
cpp/test/IceStorm/stress/.depend.mak
cpp/test/Slice/keyword/.depend
cpp/test/Slice/keyword/.depend.mak
cpp/test/Slice/parser/.depend
cpp/test/Slice/parser/.depend.mak
cpp/test/Slice/structure/.depend
cpp/test/Slice/structure/.depend.mak
py/modules/IcePy/.depend
py/modules/IcePy/.depend.mak
Diffstat (limited to 'cpp/src/Ice/EndpointI.cpp')
-rw-r--r-- | cpp/src/Ice/EndpointI.cpp | 128 |
1 files changed, 117 insertions, 11 deletions
diff --git a/cpp/src/Ice/EndpointI.cpp b/cpp/src/Ice/EndpointI.cpp index 76a3d3a5e4f..e951fedb78c 100644 --- a/cpp/src/Ice/EndpointI.cpp +++ b/cpp/src/Ice/EndpointI.cpp @@ -15,6 +15,7 @@ #include <IceUtil/MutexPtrLock.h> using namespace std; +using namespace Ice::Instrumentation; using namespace IceInternal; namespace @@ -57,6 +58,12 @@ IceInternal::EndpointI::protocol() const return _protocol; } +const string& +IceInternal::EndpointI::connectionId() const +{ + return _connectionId; +} + Ice::Int IceInternal::EndpointI::internal_getHash() const { @@ -79,9 +86,12 @@ IceInternal::EndpointI::connectors(const vector<Address>& addrs) const return vector<ConnectorPtr>(); } -IceInternal::EndpointI::EndpointI(const Ice::ProtocolVersion& protocol, const Ice::EncodingVersion& encoding) : +IceInternal::EndpointI::EndpointI(const Ice::ProtocolVersion& protocol, + const Ice::EncodingVersion& encoding, + const std::string& connectionId) : _protocol(protocol), _encoding(encoding), + _connectionId(connectionId), _hashInitialized(false) { } @@ -147,13 +157,14 @@ IceInternal::EndpointI::parseOption(const string& option, const string& arg, con #ifndef ICE_OS_WINRT IceInternal::EndpointHostResolver::EndpointHostResolver(const InstancePtr& instance) : - IceUtil::Thread("Ice endpoint host resolver thread"), + IceUtil::Thread("Ice.HostResolver"), _instance(instance), _destroyed(false) { __setNoDelete(true); try { + updateObserver(); bool hasPriority = _instance->initializationData().properties->getProperty("Ice.ThreadPriority") != ""; int priority = _instance->initializationData().properties->getPropertyAsInt("Ice.ThreadPriority"); if(hasPriority) @@ -176,6 +187,39 @@ IceInternal::EndpointHostResolver::EndpointHostResolver(const InstancePtr& insta __setNoDelete(false); } +vector<ConnectorPtr> +IceInternal::EndpointHostResolver::resolve(const string& host, int port, const EndpointIPtr& endpoint) +{ + // + // Try to get the addresses without DNS lookup. If this doesn't + // work, we retry with DNS lookup (and observer). + // + vector<struct sockaddr_storage> addrs = getAddresses(host, port, _instance->protocolSupport(), false); + if(!addrs.empty()) + { + return endpoint->connectors(addrs); + } + + ObserverHelperT<> observer; + const CommunicatorObserverPtr& obsv = _instance->initializationData().observer; + if(obsv) + { + observer.attach(obsv->getEndpointLookupObserver(endpoint)); + } + + vector<ConnectorPtr> connectors; + try + { + connectors = endpoint->connectors(getAddresses(host, port, _instance->protocolSupport(), true)); + } + catch(const Ice::LocalException& ex) + { + observer.failed(ex.ice_name()); + throw; + } + return connectors; +} + void IceInternal::EndpointHostResolver::resolve(const string& host, int port, const EndpointIPtr& endpoint, const EndpointI_connectorsPtr& callback) @@ -207,6 +251,17 @@ IceInternal::EndpointHostResolver::resolve(const string& host, int port, const E entry.port = port; entry.endpoint = endpoint; entry.callback = callback; + + const CommunicatorObserverPtr& obsv = _instance->initializationData().observer; + if(obsv) + { + entry.observer = obsv->getEndpointLookupObserver(endpoint); + if(entry.observer) + { + entry.observer->attach(); + } + } + _queue.push_back(entry); notify(); } @@ -225,11 +280,10 @@ IceInternal::EndpointHostResolver::run() { while(true) { - ResolveEntry resolve; - + ResolveEntry r; + ThreadObserverPtr threadObserver; { Lock sync(*this); - while(!_destroyed && _queue.empty()) { wait(); @@ -240,27 +294,68 @@ IceInternal::EndpointHostResolver::run() break; } - resolve = _queue.front(); + r = _queue.front(); _queue.pop_front(); + threadObserver = _observer.get(); } + const ProtocolSupport protocol = _instance->protocolSupport(); try { - resolve.callback->connectors( - resolve.endpoint->connectors( - getAddresses(resolve.host, resolve.port, _instance->protocolSupport(), true))); + if(threadObserver) + { + threadObserver->stateChanged(ThreadStateIdle, ThreadStateInUseForOther); + } + + r.callback->connectors(r.endpoint->connectors(getAddresses(r.host, r.port, protocol, true))); + + if(threadObserver) + { + threadObserver->stateChanged(ThreadStateInUseForOther, ThreadStateIdle); + } } catch(const Ice::LocalException& ex) { - resolve.callback->exception(ex); + if(r.observer) + { + r.observer->failed(ex.ice_name()); + } + r.callback->exception(ex); + } + + if(r.observer) + { + r.observer->detach(); } } for(deque<ResolveEntry>::const_iterator p = _queue.begin(); p != _queue.end(); ++p) { - p->callback->exception(Ice::CommunicatorDestroyedException(__FILE__, __LINE__)); + Ice::CommunicatorDestroyedException ex(__FILE__, __LINE__); + p->callback->exception(ex); + if(p->observer) + { + p->observer->failed(ex.ice_name()); + p->observer->detach(); + } } _queue.clear(); + + if(_observer) + { + _observer.detach(); + } +} + +void +IceInternal::EndpointHostResolver::updateObserver() +{ + Lock sync(*this); + const CommunicatorObserverPtr& obsv = _instance->initializationData().observer; + if(obsv) + { + _observer.attach(obsv->getThreadObserver("Communicator", name(), ThreadStateIdle, _observer.get())); + } } #else @@ -269,6 +364,12 @@ IceInternal::EndpointHostResolver::EndpointHostResolver(const InstancePtr& insta { } +vector<ConnectorPtr> +IceInternal::EndpointHostResolver::resolve(const string& host, int port, const EndpointIPtr& endpoint) +{ + return endpoint->connectors(); +} + void IceInternal::EndpointHostResolver::resolve(const string&, int, const EndpointIPtr& endpoint, @@ -290,4 +391,9 @@ IceInternal::EndpointHostResolver::run() { } +void +IceInternal::EndpointHostResolver::updateObserver() +{ +} + #endif |