Author: kgiusti
Date: Fri Mar  2 14:49:56 2012
New Revision: 1296230

URL: http://svn.apache.org/viewvc?rev=1296230&view=rev
Log:
QPID-3877: hold lock during message header encode.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp?rev=1296230&r1=1296229&r2=1296230&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp Fri Mar  2 14:49:56 2012
@@ -131,9 +131,12 @@ uint32_t Message::getRequiredCredit()
 
 void Message::encode(framing::Buffer& buffer) const
 {
-    //encode method and header frames
-    EncodeFrame f1(buffer);
-    frames.map_if(f1, TypeFilter2<METHOD_BODY, HEADER_BODY>());
+    {
+        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>());
+    }
 
     //then encode the payload of each content frame
     framing::EncodeBody f2(buffer);
@@ -159,6 +162,7 @@ uint32_t Message::encodedContentSize() c
 
 uint32_t Message::encodedHeaderSize() const
 {
+    sys::Mutex::ScopedLock l(lock);   // prevent modifications while computing 
size
     //add up the size for all method and header frames in the frameset
     SumFrameSize sum;
     frames.map_if(sum, TypeFilter2<METHOD_BODY, HEADER_BODY>());
@@ -354,6 +358,7 @@ public:
 
 AMQHeaderBody* Message::getHeaderBody()
 {
+    // expects lock to be held
     if (copyHeaderOnWrite) {
         CloneHeaderBody f;
         frames.map_if(f, TypeFilter<HEADER_BODY>());



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscr...@qpid.apache.org

Reply via email to