From 4811680d2a4416cd20795f9284c067d703042de2 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Mon, 1 Feb 2010 08:28:11 +0100 Subject: [PATCH] avoid copying bytes one after the other. --- src/common/buffer.cc | 32 ++++++++++++++++++++++++++++++++ src/common/buffer.h | 2 ++ src/common/packet.cc | 9 +-------- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 7f1ee2f5f..cc1f107d3 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -726,6 +726,38 @@ Buffer::CopyData(std::ostream *os, uint32_t size) const } } +uint32_t +Buffer::CopyData (uint8_t *buffer, uint32_t size) const +{ + uint32_t originalSize = size; + if (size > 0) + { + uint32_t tmpsize = std::min (m_zeroAreaStart-m_start, size); + memcpy (buffer, (const char*)(m_data->m_data + m_start), tmpsize); + buffer += tmpsize; + if (size > tmpsize) + { + size -= m_zeroAreaStart-m_start; + tmpsize = std::min (m_zeroAreaEnd - m_zeroAreaStart, size); + uint32_t left = tmpsize; + while (left > 0) + { + uint32_t toWrite = std::min (left, g_zeroes.size); + memcpy (buffer, g_zeroes.buffer, toWrite); + left -= toWrite; + buffer += toWrite; + } + if (size > tmpsize) + { + size -= tmpsize; + tmpsize = std::min (m_end - m_zeroAreaEnd, size); + memcpy (buffer, (const char*)(m_data->m_data + m_zeroAreaStart), tmpsize); + } + } + } + return originalSize - size; +} + /****************************************************** * The buffer iterator below. ******************************************************/ diff --git a/src/common/buffer.h b/src/common/buffer.h index 4d542251f..33d32b9d2 100644 --- a/src/common/buffer.h +++ b/src/common/buffer.h @@ -487,6 +487,8 @@ public: */ void CopyData (std::ostream *os, uint32_t size) const; + uint32_t CopyData (uint8_t *buffer, uint32_t size) const; + Buffer (Buffer const &o); Buffer &operator = (Buffer const &o); Buffer (); diff --git a/src/common/packet.cc b/src/common/packet.cc index 244c26e6f..8f48811a7 100644 --- a/src/common/packet.cc +++ b/src/common/packet.cc @@ -350,14 +350,7 @@ Packet::PeekData (void) const uint32_t Packet::CopyData (uint8_t *buffer, uint32_t size) const { - Buffer::Iterator i = m_buffer.Begin (); - uint32_t cur = 0; - while (!i.IsEnd () && cur < size) - { - buffer[cur] = i.ReadU8 (); - cur++; - } - return cur; + return m_buffer.CopyData (buffer, size); } void