From e286fe2d1cd165c34ea7159c4b744842aa61f930 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Tue, 10 Sep 2013 11:03:20 +0000 Subject: QPID-5122: cleaner encoding of index for delivery tags git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1521433 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/qpid/broker/amqp/Outgoing.cpp | 18 ++++++++++++++---- qpid/cpp/src/qpid/broker/amqp/Outgoing.h | 3 +++ 2 files changed, 17 insertions(+), 4 deletions(-) (limited to 'qpid/cpp/src') diff --git a/qpid/cpp/src/qpid/broker/amqp/Outgoing.cpp b/qpid/cpp/src/qpid/broker/amqp/Outgoing.cpp index 3d2644380a..8b2b380173 100644 --- a/qpid/cpp/src/qpid/broker/amqp/Outgoing.cpp +++ b/qpid/cpp/src/qpid/broker/amqp/Outgoing.cpp @@ -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* data, size_t size) void OutgoingFromQueue::handle(pn_delivery_t* delivery) { - pn_delivery_tag_t tag = pn_delivery_tag(delivery); - size_t i = *reinterpret_cast(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() : delivery(0), disposition(0), index(0) {} void OutgoingFromQueue::Record::init(size_t i) { index = i; - tag.bytes = reinterpret_cast(&index); - tag.size = sizeof(index); + qpid::framing::Buffer buffer(tagData, Record::TAG_WIDTH); + buffer.putUInt(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(t.bytes)/*won't ever be written to*/, t.size); + return (size_t) buffer.getUInt(); +} + + }}} // namespace qpid::broker::amqp diff --git a/qpid/cpp/src/qpid/broker/amqp/Outgoing.h b/qpid/cpp/src/qpid/broker/amqp/Outgoing.h index d333c54672..38d9e17190 100644 --- a/qpid/cpp/src/qpid/broker/amqp/Outgoing.h +++ b/qpid/cpp/src/qpid/broker/amqp/Outgoing.h @@ -118,10 +118,13 @@ class OutgoingFromQueue : public Outgoing, public qpid::broker::Consumer, public 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; -- cgit v1.2.1