From ae87cd35f9feba4c88064d20f6ec52cd51f7d003 Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Fri, 26 Apr 2019 15:39:27 +0300 Subject: [PATCH] network: Move empty zero area to the end of buffer if needed If the first buffer has empty zero area, it can be moved to the end of the buffer and concatenated to the zero area of the added buffer instead of falling back to the slow path. --- src/network/model/buffer.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/network/model/buffer.cc b/src/network/model/buffer.cc index 57259dd97..f5698cfd9 100644 --- a/src/network/model/buffer.cc +++ b/src/network/model/buffer.cc @@ -400,8 +400,9 @@ void Buffer::AddAtEnd (const Buffer &o) { NS_LOG_FUNCTION (this << &o); + if (m_data->m_count == 1 && - m_end == m_zeroAreaEnd && + (m_end == m_zeroAreaEnd || m_zeroAreaStart == m_zeroAreaEnd) && m_end == m_data->m_dirtyEnd && o.m_start == o.m_zeroAreaStart && o.m_zeroAreaEnd - o.m_zeroAreaStart > 0) @@ -411,8 +412,12 @@ Buffer::AddAtEnd (const Buffer &o) * we attempt to aggregate two buffers which contain * adjacent zero areas. */ + if (m_zeroAreaStart == m_zeroAreaEnd) + { + m_zeroAreaStart = m_end; + } uint32_t zeroSize = o.m_zeroAreaEnd - o.m_zeroAreaStart; - m_zeroAreaEnd += zeroSize; + m_zeroAreaEnd = m_end + zeroSize; m_end = m_zeroAreaEnd; m_data->m_dirtyEnd = m_zeroAreaEnd; uint32_t endData = o.m_end - o.m_zeroAreaEnd;