Author: gsim
Date: Tue Sep 10 11:03:20 2013
New Revision: 1521433

URL: http://svn.apache.org/r1521433
Log:
QPID-5122: cleaner encoding of index for delivery tags

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Outgoing.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Outgoing.h

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Outgoing.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Outgoing.cpp?rev=1521433&r1=1521432&r2=1521433&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Outgoing.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Outgoing.cpp Tue Sep 10 11:03:20 
2013
@@ -29,6 +29,7 @@
 #include "qpid/sys/OutputControl.h"
 #include "qpid/amqp/descriptors.h"
 #include "qpid/amqp/MessageEncoder.h"
+#include "qpid/framing/Buffer.h"
 #include "qpid/framing/reply_exceptions.h"
 #include "qpid/log/Statement.h"
 
@@ -93,8 +94,7 @@ void OutgoingFromQueue::write(const char
 
 void OutgoingFromQueue::handle(pn_delivery_t* delivery)
 {
-    pn_delivery_tag_t tag = pn_delivery_tag(delivery);
-    size_t i = *reinterpret_cast<const size_t*>(tag.bytes);
+    size_t i = Record::getIndex(pn_delivery_tag(delivery));
     Record& r = deliveries[i];
     if (pn_delivery_writable(delivery)) {
         assert(r.msg);
@@ -260,8 +260,10 @@ OutgoingFromQueue::Record::Record() : de
 void OutgoingFromQueue::Record::init(size_t i)
 {
     index = i;
-    tag.bytes = reinterpret_cast<const char*>(&index);
-    tag.size = sizeof(index);
+    qpid::framing::Buffer buffer(tagData, Record::TAG_WIDTH);
+    buffer.putUInt<Record::TAG_WIDTH>(index);
+    tag.bytes = tagData;
+    tag.size = Record::TAG_WIDTH;
 }
 void OutgoingFromQueue::Record::reset()
 {
@@ -271,5 +273,13 @@ void OutgoingFromQueue::Record::reset()
     disposition = 0;
 }
 
+size_t OutgoingFromQueue::Record::getIndex(pn_delivery_tag_t t)
+{
+    assert(t.size == TAG_WIDTH);
+    qpid::framing::Buffer buffer(const_cast<char*>(t.bytes)/*won't ever be 
written to*/, t.size);
+    return (size_t) buffer.getUInt<TAG_WIDTH>();
+}
+
+
 
 }}} // namespace qpid::broker::amqp

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Outgoing.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Outgoing.h?rev=1521433&r1=1521432&r2=1521433&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Outgoing.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Outgoing.h Tue Sep 10 11:03:20 2013
@@ -118,10 +118,13 @@ class OutgoingFromQueue : public Outgoin
         int disposition;
         size_t index;
         pn_delivery_tag_t tag;
+        static const size_t TAG_WIDTH = sizeof(size_t);
+        char tagData[TAG_WIDTH];//index in encoded form, used for tag
 
         Record();
         void init(size_t i);
         void reset();
+        static size_t getIndex(pn_delivery_tag_t);
     };
 
     const bool exclusive;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to