diff options
author | Gordon Sim <gsim@apache.org> | 2012-08-13 14:55:30 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2012-08-13 14:55:30 +0000 |
commit | 796d89efad125c4728402a2e61db6abeb9b6d524 (patch) | |
tree | ae44db926b1d2953f7b35cf004c9a26d177062e4 /qpid/cpp/src/qpid/broker/PersistableMessage.cpp | |
parent | 77fba0a917fb6757e6357aba073d3eaaf4bf1e89 (diff) | |
download | qpid-python-796d89efad125c4728402a2e61db6abeb9b6d524.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@1372453 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/qpid/broker/PersistableMessage.cpp')
-rw-r--r-- | qpid/cpp/src/qpid/broker/PersistableMessage.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/qpid/cpp/src/qpid/broker/PersistableMessage.cpp b/qpid/cpp/src/qpid/broker/PersistableMessage.cpp index 8866675c5c..b604f77aab 100644 --- a/qpid/cpp/src/qpid/broker/PersistableMessage.cpp +++ b/qpid/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() { |