From 63d6b14d454d1280be59366180eac2ec296c8ad3 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Tue, 22 Apr 2008 14:35:42 -0700 Subject: [PATCH] optimize case where fake payload is fragmented and re-assembled. --- src/common/buffer.cc | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 9859aeda0..4c5efe725 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -464,6 +464,27 @@ Buffer::AddAtEnd (uint32_t end) 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 @@ BufferTest::RunTests (void) 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; }