summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/broker/PersistableMessage.cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2012-08-13 14:55:30 +0000
committerGordon Sim <gsim@apache.org>2012-08-13 14:55:30 +0000
commit74cd0e709a7d406d943f58b110211961cfb54cb3 (patch)
tree44f2bb7adb1c70bfa54e5c1b14f8e945003dc051 /cpp/src/qpid/broker/PersistableMessage.cpp
parentde5dccea980d60ca60c586271f4ae0dc554172a4 (diff)
downloadqpid-python-74cd0e709a7d406d943f58b110211961cfb54cb3.tar.gz
QPID-4178: Fix valgrind errors: prevent circular reference in messages, prevent uninitialised required credit value.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1372453 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/PersistableMessage.cpp')
-rw-r--r--cpp/src/qpid/broker/PersistableMessage.cpp28
1 files changed, 27 insertions, 1 deletions
diff --git a/cpp/src/qpid/broker/PersistableMessage.cpp b/cpp/src/qpid/broker/PersistableMessage.cpp
index 8866675c5c..b604f77aab 100644
--- a/cpp/src/qpid/broker/PersistableMessage.cpp
+++ b/cpp/src/qpid/broker/PersistableMessage.cpp
@@ -30,7 +30,33 @@ namespace qpid {
namespace broker {
PersistableMessage::~PersistableMessage() {}
-PersistableMessage::PersistableMessage() : persistenceId(0) {}
+PersistableMessage::PersistableMessage() : ingressCompletion(0), persistenceId(0) {}
+
+void PersistableMessage::setIngressCompletion(boost::intrusive_ptr<AsyncCompletion> i)
+{
+ ingressCompletion = i.get();
+ /**
+ * What follows is a hack to account for the fact that the
+ * AsyncCompletion to use may be, but is not always, this same
+ * object.
+ *
+ * This is hopefully temporary, and allows the store interface to
+ * remain unchanged without requiring another object to be allocated
+ * for every message.
+ *
+ * The case in question is where a message previously passed to
+ * the store is modified by some other queue onto which it is
+ * pushed, and then again persisted to the store. These will be
+ * two separate PersistableMessage instances (since the latter now
+ * has different content), but need to share the same
+ * AsyncCompletion (since they refer to the same incoming transfer
+ * command).
+ */
+ if (static_cast<RefCounted*>(ingressCompletion) != static_cast<RefCounted*>(this)) {
+ holder = i;
+ }
+}
+
void PersistableMessage::flush()
{