summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Gemmell <robbie@apache.org>2010-11-07 14:51:05 +0000
committerRobert Gemmell <robbie@apache.org>2010-11-07 14:51:05 +0000
commitd916d4097901aab3e0c20dde550ad83851d5dc4e (patch)
tree1977bce22c7c73269828ca2a516170f7c14885ba
parente330f0d3937bd7dbf689ae55e5cc490cf186c95f (diff)
downloadqpid-python-d916d4097901aab3e0c20dde550ad83851d5dc4e.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@1032291 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageReference.java13
1 files changed, 7 insertions, 6 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageReference.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageReference.java
index 055403ff08..399f8f9327 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageReference.java
+++ b/qpid/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);
+ }
}
}