--- a/src/common/buffer.cc Tue Apr 22 14:18:33 2008 -0700
+++ b/src/common/buffer.cc Tue Apr 22 14:35:42 2008 -0700
@@ -464,6 +464,27 @@
void
Buffer::AddAtEnd (const Buffer &o)
{
+ if (m_end == m_zeroAreaEnd &&
+ o.m_start == o.m_zeroAreaStart &&
+ o.m_zeroAreaEnd - o.m_zeroAreaStart > 0)
+ {
+ /**
+ * This is an optimization which kicks in when
+ * we attempt to aggregate two buffers which contain
+ * adjacent zero areas.
+ */
+ uint32_t zeroSize = o.m_zeroAreaEnd - o.m_zeroAreaStart;
+ m_zeroAreaEnd += zeroSize;
+ m_end = m_zeroAreaEnd;
+ uint32_t endData = o.m_end - o.m_zeroAreaEnd;
+ AddAtEnd (endData);
+ Buffer::Iterator dst = End ();
+ dst.Prev (endData);
+ Buffer::Iterator src = o.End ();
+ src.Prev (endData);
+ dst.Write (src, o.End ());
+ return;
+ }
Buffer dst = CreateFullCopy ();
Buffer src = o.CreateFullCopy ();
@@ -1336,6 +1357,21 @@
NS_TEST_ASSERT (memcmp (inputBuffer.PeekData (), outputBuffer.PeekData (), chunkSize) == 0);
}
+ buffer = Buffer (5);
+ buffer.AddAtEnd (2);
+ i = buffer.End ();
+ i.Prev (2);
+ i.WriteU8 (0);
+ i.WriteU8 (0x66);
+ ENSURE_WRITTEN_BYTES (buffer, 7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66);
+ Buffer frag0 = buffer.CreateFragment (0, 2);
+ ENSURE_WRITTEN_BYTES (frag0, 2, 0x00, 0x00);
+ Buffer frag1 = buffer.CreateFragment (2, 5);
+ ENSURE_WRITTEN_BYTES (frag1, 5, 0x00, 0x00, 0x00, 0x00, 0x66);
+ frag0.AddAtEnd (frag1);
+ ENSURE_WRITTEN_BYTES (buffer, 7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66);
+ ENSURE_WRITTEN_BYTES (frag0, 7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66);
+
return result;
}