diff options
| author | Robert Godfrey <rgodfrey@apache.org> | 2013-03-27 20:42:18 +0000 |
|---|---|---|
| committer | Robert Godfrey <rgodfrey@apache.org> | 2013-03-27 20:42:18 +0000 |
| commit | 54a0ed7a71cbcdc4719eb45125c39cd04afcd542 (patch) | |
| tree | c08beb7d5f6d3a50a814c18ea5a93b9f4f57cf56 /java | |
| parent | 7f52bf9af8c3704f9404fb5df66fd7034a3a3c9d (diff) | |
| download | qpid-python-54a0ed7a71cbcdc4719eb45125c39cd04afcd542.tar.gz | |
QPID-4673 : [Java Broker AMQP 1.0] Remove potential for deadlock between connection and subscription in 1.0 codepath
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1461844 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java')
| -rw-r--r-- | java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java index 8bde913149..f865837350 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java +++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java @@ -717,15 +717,18 @@ class Subscription_1_0 implements Subscription getEndpoint().detach(); } - public synchronized boolean wouldSuspend(final QueueEntry msg) + public boolean wouldSuspend(final QueueEntry msg) { - final boolean hasCredit = _link.isAttached() && getEndpoint().hasCreditToSend(); - if(!hasCredit && getState() == State.ACTIVE) + synchronized (_link.getLock()) { - suspend(); - } + final boolean hasCredit = _link.isAttached() && getEndpoint().hasCreditToSend(); + if(!hasCredit && getState() == State.ACTIVE) + { + suspend(); + } - return !hasCredit; + return !hasCredit; + } } public boolean trySendLock() @@ -733,11 +736,14 @@ class Subscription_1_0 implements Subscription return _stateChangeLock.tryLock(); } - public synchronized void suspend() + public void suspend() { - if(_state.compareAndSet(State.ACTIVE, State.SUSPENDED)) + synchronized(_link.getLock()) { - _stateListener.stateChange(this, State.ACTIVE, State.SUSPENDED); + if(_state.compareAndSet(State.ACTIVE, State.SUSPENDED)) + { + _stateListener.stateChange(this, State.ACTIVE, State.SUSPENDED); + } } } @@ -808,26 +814,32 @@ class Subscription_1_0 implements Subscription return false; //TODO } - public synchronized void queueEmpty() + public void queueEmpty() { - if(_link.drained()) + synchronized(_link.getLock()) { - if(_state.compareAndSet(State.ACTIVE, State.SUSPENDED)) + if(_link.drained()) { - _stateListener.stateChange(this, State.ACTIVE, State.SUSPENDED); + if(_state.compareAndSet(State.ACTIVE, State.SUSPENDED)) + { + _stateListener.stateChange(this, State.ACTIVE, State.SUSPENDED); + } } } } - public synchronized void flowStateChanged() + public void flowStateChanged() { - if(isSuspended() && getEndpoint() != null) + synchronized(_link.getLock()) { - if(_state.compareAndSet(State.SUSPENDED, State.ACTIVE)) + if(isSuspended() && getEndpoint() != null) { - _stateListener.stateChange(this, State.SUSPENDED, State.ACTIVE); + if(_state.compareAndSet(State.SUSPENDED, State.ACTIVE)) + { + _stateListener.stateChange(this, State.SUSPENDED, State.ACTIVE); + } + _transactionId = _link.getTransactionId(); } - _transactionId = _link.getTransactionId(); } } |
