diff options
author | Robert Gemmell <robbie@apache.org> | 2010-11-07 14:51:05 +0000 |
---|---|---|
committer | Robert Gemmell <robbie@apache.org> | 2010-11-07 14:51:05 +0000 |
commit | f2583125951c088ccf3e745783d3121e5b38758a (patch) | |
tree | 904bdea7f84fdbde135da795ed51c44112744959 /java/broker/src/main/java/org | |
parent | bbec7a6d0b3615b09c62a9ff31fa1a7bc96c5a1f (diff) | |
download | qpid-python-f2583125951c088ccf3e745783d3121e5b38758a.tar.gz |
QPID-2931: update MessageReference to stop nulling out the ServerMessage reference upon release for now, preventing NPE's experienced due to race conditions resulting in use of getMessage() after release.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1032291 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/broker/src/main/java/org')
-rw-r--r-- | java/broker/src/main/java/org/apache/qpid/server/message/MessageReference.java | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/server/message/MessageReference.java b/java/broker/src/main/java/org/apache/qpid/server/message/MessageReference.java index 055403ff08..399f8f9327 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/message/MessageReference.java +++ b/java/broker/src/main/java/org/apache/qpid/server/message/MessageReference.java @@ -20,13 +20,12 @@ */ package org.apache.qpid.server.message; -import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; +import java.util.concurrent.atomic.AtomicBoolean; public abstract class MessageReference<M extends ServerMessage> { - private static final AtomicReferenceFieldUpdater<MessageReference, ServerMessage> _messageUpdater = - AtomicReferenceFieldUpdater.newUpdater(MessageReference.class, ServerMessage.class,"_message"); + private final AtomicBoolean _released = new AtomicBoolean(false); private volatile M _message; @@ -47,10 +46,12 @@ public abstract class MessageReference<M extends ServerMessage> public void release() { - M message = (M) _messageUpdater.getAndSet(this,null); - if(message != null) + if(!_released.getAndSet(true)) { - onRelease(message); + if(_message != null) + { + onRelease(_message); + } } } |