You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2009/01/22 22:48:47 UTC

svn commit: r736810 - in /qpid/trunk/qpid/cpp/src/qpid/framing: AMQFrame.cpp AMQFrame.h

Author: aconway
Date: Thu Jan 22 13:48:47 2009
New Revision: 736810

URL: http://svn.apache.org/viewvc?rev=736810&view=rev
Log:
Optimization: cache results of AMQFrame::encodedSize().

Modified:
    qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp
    qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.h

Modified: qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp?rev=736810&r1=736809&r2=736810&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp Thu Jan 22 13:48:47 2009
@@ -30,7 +30,12 @@
 namespace qpid {
 namespace framing {
 
-void AMQFrame::init() { bof = eof = bos = eos = true; subchannel=0; channel=0; }
+void AMQFrame::init() {
+    bof = eof = bos = eos = true;
+    subchannel=0;
+    channel=0;
+    encodedSizeCache = 0;
+}
 
 AMQFrame::AMQFrame(const boost::intrusive_ptr<AMQBody>& b) : body(b) { init(); }
 
@@ -38,13 +43,28 @@
 
 AMQFrame::~AMQFrame() {}
 
-void AMQFrame::setMethod(ClassId c, MethodId m) { body = MethodBodyFactory::create(c,m); }
+AMQBody* AMQFrame::getBody() {
+    // Non-const AMQBody* may be used to modify the body.
+    encodedSizeCache = 0;
+    return body.get();
+}
+
+const AMQBody* AMQFrame::getBody() const {
+    return body.get();
+}
+
+void AMQFrame::setMethod(ClassId c, MethodId m) {
+    encodedSizeCache = 0;
+    body = MethodBodyFactory::create(c,m);
+}
 
 uint32_t AMQFrame::encodedSize() const {
-    uint32_t size = frameOverhead() + body->encodedSize();
-    if (body->getMethod())
-        size +=  sizeof(ClassId)+sizeof(MethodId);
-    return size;
+    if (!encodedSizeCache) {
+        encodedSizeCache = frameOverhead() + body->encodedSize();
+        if (body->getMethod())
+            encodedSizeCache +=  sizeof(ClassId)+sizeof(MethodId);
+    }
+    return encodedSizeCache;
 }
 
 uint32_t AMQFrame::frameOverhead() {
@@ -80,11 +100,13 @@
 }
 
 bool AMQFrame::decode(Buffer& buffer)
-{    
+{
     if(buffer.available() < frameOverhead())
         return false;
     buffer.record();
 
+    encodedSizeCache = 0;
+    uint32_t start = buffer.getPosition();
     uint8_t  flags = buffer.getOctet();
     uint8_t framing_version = (flags & 0xc0) >> 6;
     if (framing_version != 0)
@@ -133,7 +155,7 @@
 	throw IllegalArgumentException(QPID_MSG("Invalid frame type " << type));
     }
     body->decode(buffer, body_size);
-
+    encodedSizeCache = buffer.getPosition() - start;
     return true;
 }
 

Modified: qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.h?rev=736810&r1=736809&r2=736810&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.h Thu Jan 22 13:48:47 2009
@@ -43,8 +43,8 @@
     ChannelId getChannel() const { return channel; }
     void setChannel(ChannelId c) { channel = c; }
 
-    AMQBody* getBody() { return body.get(); }
-    const AMQBody* getBody() const { return body.get(); }
+    AMQBody* getBody();
+    const AMQBody* getBody() const;
 
     AMQMethodBody* getMethod() { return getBody()->getMethod(); }
     const AMQMethodBody* getMethod() const { return getBody()->getMethod(); }
@@ -102,6 +102,7 @@
     bool eof : 1;
     bool bos : 1;
     bool eos : 1;
+    mutable uint32_t encodedSizeCache;
 };
 
 std::ostream& operator<<(std::ostream&, const AMQFrame&);



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