implement ReplaceTail
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 06 Jun 2007 12:39:33 +0200
changeset 855 6b27e6180fcb
parent 854 cbe6790bf9fa
child 856 007981962639
implement ReplaceTail
src/common/packet-history.cc
src/common/packet-history.h
--- a/src/common/packet-history.cc	Wed Jun 06 11:30:17 2007 +0200
+++ b/src/common/packet-history.cc	Wed Jun 06 12:39:33 2007 +0200
@@ -727,9 +727,44 @@
 
 void
 PacketHistory::ReplaceTail (const PacketHistory::SmallItem *item, 
-                            const PacketHistory::ExtraItem *extraItem)
+                            const PacketHistory::ExtraItem *extraItem,
+                            uint32_t available)
 {
+  NS_ASSERT (m_data != 0);  
+  if (available >= 10 &&
+      (m_data->m_count == 1 ||
+       m_used == m_data->m_dirtyEnd))
+    {
+      uint8_t *buffer = &m_data->m_data[m_tail];
+      uint8_t *end = buffer + available;
 
+      Append16 (item->next, &buffer);
+      Append16 (item->prev, &buffer);
+      if (TryToAppend (item->typeUid, &buffer, end) &&
+          TryToAppend (item->size, &buffer, end) &&
+          TryToAppend (item->chunkUid, &buffer, end) &&
+          TryToAppend (extraItem->fragmentStart, &buffer, end) &&
+          TryToAppend (extraItem->fragmentEnd, &buffer, end) &&
+          TryToAppend (extraItem->packetUid, &buffer, end))
+        {
+          return;
+        }
+    }
+  
+  // create a copy of the packet.
+  PacketHistory h (m_packetUid, 0);
+  uint16_t current = m_head;
+  while (current != 0xffff && current != m_tail)
+    {
+      struct PacketHistory::SmallItem tmpItem;
+      PacketHistory::ExtraItem tmpExtraItem;
+      ReadItems (current, &tmpItem, &tmpExtraItem);
+      h.AddBig (false, &tmpItem, &tmpExtraItem);
+    }
+  // append new tail.
+  h.AddBig (false, item, extraItem);
+
+  *this = h;
 }
 
 
@@ -748,7 +783,7 @@
   item->chunkUid = ReadUleb128 (pBuffer);
 }
 
-void
+uint32_t
 PacketHistory::ReadItems (uint16_t current, 
                           struct PacketHistory::SmallItem *item,
                           struct PacketHistory::ExtraItem *extraItem) const
@@ -767,6 +802,7 @@
       extraItem->packetUid = m_packetUid;
     }
   NS_ASSERT (buffer <= &m_data->m_data[m_data->m_size]);
+  return buffer - &m_data->m_data[current];
 }
 
 
@@ -968,7 +1004,12 @@
   uint16_t lastTail = m_tail;
   struct PacketHistory::SmallItem lastItem;
   PacketHistory::ExtraItem lastExtraItem;
-  ReadItems (m_tail, &lastItem, &lastExtraItem);
+  uint32_t lastTailSize = ReadItems (m_tail, &lastItem, &lastExtraItem);
+  if (m_tail + lastTailSize == m_used &&
+      m_used == m_data->m_dirtyEnd)
+    {
+      lastTailSize = m_data->m_size;
+    }
 
   uint16_t current = o.m_head;
   while (current != 0xffff)
@@ -982,13 +1023,14 @@
           item.size == lastItem.size &&
           extraItem.fragmentStart == lastExtraItem.fragmentEnd)
         {
-          // add at tail
+          // replace previous tail.
           lastExtraItem.fragmentEnd = extraItem.fragmentEnd;
           NS_ASSERT (m_tail == lastTail);
-          ReplaceTail (&lastItem, &lastExtraItem);
+          ReplaceTail (&lastItem, &lastExtraItem, lastTailSize);
         }
       else
         {
+          // append the extra items.
           AddBig (false, &item, &extraItem);
         }
       current = item.next;
@@ -996,7 +1038,7 @@
         {
           break;
         }
-    }  
+    }
 }
 void
 PacketHistory::AddPaddingAtEnd (uint32_t end)
--- a/src/common/packet-history.h	Wed Jun 06 11:30:17 2007 +0200
+++ b/src/common/packet-history.h	Wed Jun 06 12:39:33 2007 +0200
@@ -104,7 +104,8 @@
                const PacketHistory::SmallItem *item, 
                const PacketHistory::ExtraItem *extraItem);
   void ReplaceTail (const PacketHistory::SmallItem *item, 
-                    const PacketHistory::ExtraItem *extraItem);
+                    const PacketHistory::ExtraItem *extraItem,
+                    uint32_t available);
   void Update (bool atStart, uint16_t written);
   uint32_t GetUleb128Size (uint32_t value) const;
   uint32_t ReadUleb128 (const uint8_t **pBuffer) const;
@@ -120,9 +121,9 @@
                     Buffer data, uint32_t offset, const PacketPrinter &printer,
                     std::ostream &os) const;
   uint32_t GetTotalSize (void) const;
-  void ReadItems (uint16_t current, 
-                  struct PacketHistory::SmallItem *item,
-                  struct PacketHistory::ExtraItem *extraItem) const;
+  uint32_t ReadItems (uint16_t current, 
+                      struct PacketHistory::SmallItem *item,
+                      struct PacketHistory::ExtraItem *extraItem) const;
 
 
   static struct PacketHistory::Data *Create (uint32_t size);