diff options
author | Kenneth Anthony Giusti <kgiusti@apache.org> | 2012-03-20 18:28:06 +0000 |
---|---|---|
committer | Kenneth Anthony Giusti <kgiusti@apache.org> | 2012-03-20 18:28:06 +0000 |
commit | 22cdff50e28cc87eed3c306206f120c8fd3ba4a9 (patch) | |
tree | 87d7a3209bf3980ab5bf67ac83dedcca696918c1 | |
parent | 5a3a1c143bca3d2adb703f2873d216f37f644903 (diff) | |
download | qpid-python-22cdff50e28cc87eed3c306206f120c8fd3ba4a9.tar.gz |
QPID-3877: hold msg lock across body encode.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1303068 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/cpp/src/qpid/broker/Message.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/qpid/cpp/src/qpid/broker/Message.cpp b/qpid/cpp/src/qpid/broker/Message.cpp index 7093a68d6c..40dfba39f4 100644 --- a/qpid/cpp/src/qpid/broker/Message.cpp +++ b/qpid/cpp/src/qpid/broker/Message.cpp @@ -131,12 +131,10 @@ uint32_t Message::getRequiredCredit() void Message::encode(framing::Buffer& buffer) const { - { - sys::Mutex::ScopedLock l(lock); // prevent header modifications while encoding - //encode method and header frames - EncodeFrame f1(buffer); - frames.map_if(f1, TypeFilter2<METHOD_BODY, HEADER_BODY>()); - } + sys::Mutex::ScopedLock l(lock); + //encode method and header frames + EncodeFrame f1(buffer); + frames.map_if(f1, TypeFilter2<METHOD_BODY, HEADER_BODY>()); //then encode the payload of each content frame framing::EncodeBody f2(buffer); @@ -145,6 +143,7 @@ void Message::encode(framing::Buffer& buffer) const void Message::encodeContent(framing::Buffer& buffer) const { + sys::Mutex::ScopedLock l(lock); //encode the payload of each content frame EncodeBody f2(buffer); frames.map_if(f2, TypeFilter<CONTENT_BODY>()); @@ -157,6 +156,7 @@ uint32_t Message::encodedSize() const uint32_t Message::encodedContentSize() const { + sys::Mutex::ScopedLock l(lock); return frames.getContentSize(); } @@ -222,8 +222,9 @@ void Message::releaseContent() store->stage(pmsg); staged = true; } - //ensure required credit is cached before content frames are released + //ensure required credit and size is cached before content frames are released getRequiredCredit(); + contentSize(); //remove any content frames from the frameset frames.remove(TypeFilter<CONTENT_BODY>()); setContentReleased(); |