From d916d4097901aab3e0c20dde550ad83851d5dc4e Mon Sep 17 00:00:00 2001 From: Robert Gemmell Date: Sun, 7 Nov 2010 14:51:05 +0000 Subject: 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 --- .../org/apache/qpid/server/message/MessageReference.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'qpid/java') 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 { - private static final AtomicReferenceFieldUpdater _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 public void release() { - M message = (M) _messageUpdater.getAndSet(this,null); - if(message != null) + if(!_released.getAndSet(true)) { - onRelease(message); + if(_message != null) + { + onRelease(_message); + } } } -- cgit v1.2.1