optimize case where fake payload is fragmented and re-assembled.

This commit is contained in:
Mathieu Lacage
2008-04-22 14:35:42 -07:00
parent 815f3721b7
commit 63d6b14d45

View File

@@ -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;
}