update carefully m_maxZeroAreaSize and update correctly m_end and m_zeroAreaEnd in RemoveAtStart
--- a/src/common/buffer.cc Mon Sep 10 17:55:39 2007 +0200
+++ b/src/common/buffer.cc Mon Sep 10 18:43:29 2007 +0200
@@ -665,8 +665,8 @@
m_zeroAreaStart += delta;
m_zeroAreaEnd += delta;
m_end += delta;
- m_maxZeroAreaStart = std::max (m_maxZeroAreaStart, m_zeroAreaStart);
}
+ m_maxZeroAreaStart = std::max (m_maxZeroAreaStart, m_zeroAreaStart);
// update dirty area
m_data->m_dirtyStart = m_start;
m_data->m_dirtyEnd = m_end;
@@ -724,6 +724,7 @@
m_end += end;
}
+ m_maxZeroAreaStart = std::max (m_maxZeroAreaStart, m_zeroAreaStart);
// update dirty area
m_data->m_dirtyStart = m_start;
m_data->m_dirtyEnd = m_end;
@@ -746,25 +747,32 @@
{
/* remove start of buffer _and_ start of zero area
*/
- m_start = newStart;
- m_zeroAreaStart = newStart;
+ uint32_t delta = newStart - m_zeroAreaStart;
+ m_start = m_zeroAreaStart;
+ m_zeroAreaEnd -= delta;
+ m_end -= delta;
}
else if (newStart <= m_end)
{
/* remove start of buffer, complete zero area, and part
* of end of buffer
*/
- m_start = newStart;
- m_zeroAreaStart = newStart;
- m_zeroAreaEnd = newStart;
+ NS_ASSERT (m_end >= start);
+ uint32_t zeroSize = m_zeroAreaEnd - m_zeroAreaStart;
+ m_start = newStart - zeroSize;
+ m_end -= zeroSize;
+ m_zeroAreaStart = m_start;
+ m_zeroAreaEnd = m_start;
}
else
{
/* remove all buffer */
+ m_end -= m_zeroAreaEnd - m_zeroAreaStart;
m_start = m_end;
+ m_zeroAreaEnd = m_end;
m_zeroAreaStart = m_end;
- m_zeroAreaEnd = m_end;
}
+ m_maxZeroAreaStart = std::max (m_maxZeroAreaStart, m_zeroAreaStart);
DEBUG_INTERNAL_STATE ("rem start=" << start << ", ");
NS_ASSERT (CheckInternalState ());
}
@@ -798,6 +806,7 @@
m_zeroAreaEnd = m_start;
m_zeroAreaStart = m_start;
}
+ m_maxZeroAreaStart = std::max (m_maxZeroAreaStart, m_zeroAreaStart);
DEBUG_INTERNAL_STATE ("rem end=" << end << ", ");
NS_ASSERT (CheckInternalState ());
}