diff options
| author | Alan Conway <aconway@apache.org> | 2010-05-13 18:54:39 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2010-05-13 18:54:39 +0000 |
| commit | 7e13897c9238d0e5a6a64df64eeddceb14c36002 (patch) | |
| tree | 3e91072bbb28ba7f2403477b2c7f2f945cb3699c /cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp | |
| parent | 211eb170c15e6951f28e900e0ea8284e4e1456eb (diff) | |
| download | qpid-python-7e13897c9238d0e5a6a64df64eeddceb14c36002.tar.gz | |
Fix deadlocks & thread safety in new API classes.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@943973 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp')
| -rw-r--r-- | cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp b/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp index 2c581e9d41..3ebc5f17ad 100644 --- a/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp +++ b/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp @@ -109,6 +109,7 @@ ConnectionImpl::ConnectionImpl(const std::string& url, const Variant::Map& optio void ConnectionImpl::setOptions(const Variant::Map& options) { + sys::Mutex::ScopedLock l(lock); convert(options, settings); setIfFound(options, "reconnect", reconnect); setIfFound(options, "reconnect-timeout", timeout); @@ -139,13 +140,14 @@ void ConnectionImpl::setOption(const std::string& name, const Variant& value) void ConnectionImpl::close() { - std::vector<std::string> names; - { - qpid::sys::Mutex::ScopedLock l(lock); - for (Sessions::const_iterator i = sessions.begin(); i != sessions.end(); ++i) names.push_back(i->first); - } - for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i) { - getSession(*i).close(); + while(true) { + messaging::Session session; + { + qpid::sys::Mutex::ScopedLock l(lock); + if (sessions.empty()) break; + session = sessions.begin()->second; + } + session.close(); } detach(); } @@ -246,12 +248,7 @@ void ConnectionImpl::connect(const qpid::sys::AbsTime& started) bool ConnectionImpl::tryConnect() { - if (tryConnect(urls)) return resetSessions(); - else return false; -} - -bool ConnectionImpl::tryConnect(const std::vector<std::string>& urls) -{ + sys::Mutex::ScopedLock l(lock); for (std::vector<std::string>::const_iterator i = urls.begin(); i != urls.end(); ++i) { try { QPID_LOG(info, "Trying to connect to " << *i << "..."); @@ -264,7 +261,7 @@ bool ConnectionImpl::tryConnect(const std::vector<std::string>& urls) connection.open(settings); } QPID_LOG(info, "Connected to " << *i); - return true; + return resetSessions(l); } catch (const qpid::ConnectionException& e) { //TODO: need to fix timeout on //qpid::client::Connection::open() so that it throws @@ -275,7 +272,7 @@ bool ConnectionImpl::tryConnect(const std::vector<std::string>& urls) return false; } -bool ConnectionImpl::resetSessions() +bool ConnectionImpl::resetSessions(const sys::Mutex::ScopedLock& ) { try { qpid::sys::Mutex::ScopedLock l(lock); |
