summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2013-11-07 08:44:55 +0000
committerRobert Godfrey <rgodfrey@apache.org>2013-11-07 08:44:55 +0000
commit7174b59dbbf8966d2e1cd1d962ba4d97b91eecf7 (patch)
tree91da69f228cc3f3dd9c15f6cae0b00e2b586ed21
parentfe0c225e094c74cb8850c6629dc6a82378c90cd1 (diff)
downloadqpid-python-7174b59dbbf8966d2e1cd1d962ba4d97b91eecf7.tar.gz
QPID-5293 : Thread deadlock when closing connection
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1539556 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java45
1 files changed, 29 insertions, 16 deletions
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java
index 80875fcfa7..20454ace65 100644
--- a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java
@@ -341,27 +341,40 @@ public class ConnectionImpl implements Connection, QueueConnection, TopicConnect
public void close() throws JMSException
{
- synchronized(_lock)
+ Object outerLock;
+ if(_conn != null)
+ {
+ outerLock = _conn.getEndpoint().getLock();
+ }
+ else
{
- if(_state != State.CLOSED)
+ outerLock = _lock;
+ }
+
+ synchronized (outerLock)
+ {
+ synchronized(_lock)
{
- stop();
- List<SessionImpl> sessions = new ArrayList<SessionImpl>(_sessions);
- for(SessionImpl session : sessions)
- {
- session.close();
- }
- for(CloseTask task : _closeTasks)
+ if(_state != State.CLOSED)
{
- task.onClose();
- }
- if(_conn != null && _state != State.UNCONNECTED ) {
- _conn.close();
+ stop();
+ List<SessionImpl> sessions = new ArrayList<SessionImpl>(_sessions);
+ for(SessionImpl session : sessions)
+ {
+ session.close();
+ }
+ for(CloseTask task : _closeTasks)
+ {
+ task.onClose();
+ }
+ if(_conn != null && _state != State.UNCONNECTED ) {
+ _conn.close();
+ }
+ _state = State.CLOSED;
}
- _state = State.CLOSED;
- }
- _lock.notifyAll();
+ _lock.notifyAll();
+ }
}
}