add logging, cleanup AddAtEnd.
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Sat May 31 10:46:23 2008 -0700 (20 months ago)
changeset 3198dc084a4c70bb
parent 3188 080e43146c47
child 3199 03265a7051b6
add logging, cleanup AddAtEnd.
src/common/packet-metadata.cc
     1.1 --- a/src/common/packet-metadata.cc	Fri May 30 11:11:00 2008 -0700
     1.2 +++ b/src/common/packet-metadata.cc	Sat May 31 10:46:23 2008 -0700
     1.3 @@ -350,6 +350,7 @@
     1.4  void
     1.5  PacketMetadata::UpdateTail (uint16_t written)
     1.6  {
     1.7 +  NS_LOG_FUNCTION (this << written);
     1.8    if (m_head == 0xffff)
     1.9      {
    1.10        NS_ASSERT (m_tail == 0xffff);
    1.11 @@ -376,6 +377,7 @@
    1.12  void
    1.13  PacketMetadata::UpdateHead (uint16_t written)
    1.14  {
    1.15 +  NS_LOG_FUNCTION (this << written);
    1.16    if (m_head == 0xffff)
    1.17      {
    1.18        NS_ASSERT (m_tail == 0xffff);
    1.19 @@ -401,6 +403,7 @@
    1.20  uint16_t
    1.21  PacketMetadata::AddSmall (const struct PacketMetadata::SmallItem *item)
    1.22  {
    1.23 +  NS_LOG_FUNCTION (this << item->next << item->prev << item->typeUid << item->size << item->chunkUid);
    1.24    NS_ASSERT (m_data != 0);
    1.25    NS_ASSERT (m_used != item->prev && m_used != item->next);
    1.26    uint32_t typeUidSize = GetUleb128Size (item->typeUid);
    1.27 @@ -431,6 +434,9 @@
    1.28                         const PacketMetadata::SmallItem *item, 
    1.29                         const PacketMetadata::ExtraItem *extraItem)
    1.30  {
    1.31 +  NS_LOG_FUNCTION (this << next << prev <<  
    1.32 +                   item->next << item->prev << item->typeUid << item->size << item->chunkUid <<
    1.33 +                   extraItem->fragmentStart << extraItem->fragmentEnd << extraItem->packetUid);
    1.34    NS_ASSERT (m_data != 0);
    1.35    uint32_t typeUid = ((item->typeUid & 0x1) == 0x1)?item->typeUid:item->typeUid+1;
    1.36    NS_ASSERT (m_used != prev && m_used != next);
    1.37 @@ -470,12 +476,32 @@
    1.38    return n;
    1.39  }
    1.40  
    1.41 +/**
    1.42 + * \param item the item data to write
    1.43 + * \param extraItem the extra item data to write
    1.44 + * \param available the number of bytes which can 
    1.45 + *        be written without having to rewrite the buffer entirely.
    1.46 + *
    1.47 + * XXX: should rewrite the code below to avoid using 
    1.48 + * TryToAppend calls.
    1.49 + */
    1.50  void
    1.51  PacketMetadata::ReplaceTail (PacketMetadata::SmallItem *item, 
    1.52                              PacketMetadata::ExtraItem *extraItem,
    1.53                              uint32_t available)
    1.54  {
    1.55 +  NS_LOG_FUNCTION (this <<
    1.56 +                   item->next << item->prev << item->typeUid << item->size << item->chunkUid <<
    1.57 +                   extraItem->fragmentStart << extraItem->fragmentEnd << extraItem->packetUid <<
    1.58 +                   available);
    1.59 +
    1.60    NS_ASSERT (m_data != 0);  
    1.61 +  if (m_tail + available == m_used &&
    1.62 +      m_used == m_data->m_dirtyEnd)
    1.63 +    {
    1.64 +      available = m_data->m_size - m_tail;
    1.65 +    }
    1.66 +
    1.67    if (available >= 14 &&
    1.68        m_data->m_count == 1)
    1.69      {
    1.70 @@ -518,11 +544,18 @@
    1.71    *this = h;
    1.72  }
    1.73  
    1.74 +/**
    1.75 + * \param current the offset we should start reading the data from
    1.76 + * \param item pointer to where we should store the data to return to the caller
    1.77 + * \param extraItem pointer to where we should store the data to return to the caller
    1.78 + * \returns the number of bytes read.
    1.79 + */
    1.80  uint32_t
    1.81  PacketMetadata::ReadItems (uint16_t current, 
    1.82                            struct PacketMetadata::SmallItem *item,
    1.83                            struct PacketMetadata::ExtraItem *extraItem) const
    1.84  {
    1.85 +  NS_LOG_FUNCTION (this << current);
    1.86    const uint8_t *buffer = &m_data->m_data[current];
    1.87    item->next = buffer[0];
    1.88    item->next |= (buffer[1]) << 8;
    1.89 @@ -644,12 +677,12 @@
    1.90  void
    1.91  PacketMetadata::DoAddHeader (uint32_t uid, uint32_t size)
    1.92  {
    1.93 +  NS_LOG_FUNCTION (this << uid << size);
    1.94    if (!m_enable)
    1.95      {
    1.96        m_metadataSkipped = true;
    1.97        return;
    1.98      }
    1.99 -  NS_LOG_FUNCTION ("uid=" << uid << "size=" << size << "");
   1.100  
   1.101    struct PacketMetadata::SmallItem item;
   1.102    item.next = m_head;
   1.103 @@ -665,12 +698,12 @@
   1.104  PacketMetadata::RemoveHeader (const Header &header, uint32_t size)
   1.105  {
   1.106    uint32_t uid = header.GetInstanceTypeId ().GetUid () << 1;
   1.107 +  NS_LOG_FUNCTION (this << uid << size);
   1.108    if (!m_enable) 
   1.109      {
   1.110        m_metadataSkipped = true;
   1.111        return;
   1.112      }
   1.113 -  NS_LOG_FUNCTION ("(uid=" << uid << ", size=" << size << ")");
   1.114    struct PacketMetadata::SmallItem item;
   1.115    struct PacketMetadata::ExtraItem extraItem;
   1.116    uint32_t read = ReadItems (m_head, &item, &extraItem);
   1.117 @@ -703,12 +736,12 @@
   1.118  PacketMetadata::AddTrailer (const Trailer &trailer, uint32_t size)
   1.119  {
   1.120    uint32_t uid = trailer.GetInstanceTypeId ().GetUid () << 1;
   1.121 +  NS_LOG_FUNCTION (this << uid << size);
   1.122    if (!m_enable)
   1.123      {
   1.124        m_metadataSkipped = true;
   1.125        return;
   1.126      }
   1.127 -  NS_LOG_FUNCTION ("(uid=" << uid << ", size=" << size << ")");
   1.128    struct PacketMetadata::SmallItem item;
   1.129    item.next = 0xffff;
   1.130    item.prev = m_tail;
   1.131 @@ -723,12 +756,12 @@
   1.132  PacketMetadata::RemoveTrailer (const Trailer &trailer, uint32_t size)
   1.133  {
   1.134    uint32_t uid = trailer.GetInstanceTypeId ().GetUid () << 1;
   1.135 +  NS_LOG_FUNCTION (this << uid << size);
   1.136    if (!m_enable) 
   1.137      {
   1.138        m_metadataSkipped = true;
   1.139        return;
   1.140      }
   1.141 -  NS_LOG_FUNCTION ("(uid=" << uid << ", size=" << size << ")");
   1.142    struct PacketMetadata::SmallItem item;
   1.143    struct PacketMetadata::ExtraItem extraItem;
   1.144    uint32_t read = ReadItems (m_tail, &item, &extraItem);
   1.145 @@ -760,6 +793,7 @@
   1.146  void
   1.147  PacketMetadata::AddAtEnd (PacketMetadata const&o)
   1.148  {
   1.149 +  NS_LOG_FUNCTION (this << &o);
   1.150    if (!m_enable) 
   1.151      {
   1.152        m_metadataSkipped = true;
   1.153 @@ -767,46 +801,53 @@
   1.154      }
   1.155    if (m_tail == 0xffff)
   1.156      {
   1.157 +      // We have no items so 'AddAtEnd' is 
   1.158 +      // equivalent to self-assignment.
   1.159        *this = o;
   1.160        return;
   1.161      }
   1.162    NS_ASSERT (m_head != 0xffff && m_tail != 0xffff);
   1.163  
   1.164 -  uint16_t lastTail;
   1.165 -  lastTail = m_tail;
   1.166 -  struct PacketMetadata::SmallItem lastItem;
   1.167 -  PacketMetadata::ExtraItem lastExtraItem;
   1.168 -  uint32_t lastTailSize = ReadItems (m_tail, &lastItem, &lastExtraItem);
   1.169 -  if (m_tail + lastTailSize == m_used &&
   1.170 -      m_used == m_data->m_dirtyEnd)
   1.171 +  // We read the current tail because we are going to append
   1.172 +  // after this item.
   1.173 +  struct PacketMetadata::SmallItem tailItem;
   1.174 +  PacketMetadata::ExtraItem tailExtraItem;
   1.175 +  uint32_t tailSize = ReadItems (m_tail, &tailItem, &tailExtraItem);
   1.176 +
   1.177 +  uint16_t current;
   1.178 +  struct PacketMetadata::SmallItem item;
   1.179 +  PacketMetadata::ExtraItem extraItem;
   1.180 +  o.ReadItems (o.m_head, &item, &extraItem);
   1.181 +  if (extraItem.packetUid == tailExtraItem.packetUid &&
   1.182 +      item.typeUid == tailItem.typeUid &&
   1.183 +      item.chunkUid == tailItem.chunkUid &&
   1.184 +      item.size == tailItem.size &&
   1.185 +      extraItem.fragmentStart == tailExtraItem.fragmentEnd)
   1.186      {
   1.187 -      lastTailSize = m_data->m_size - m_tail;
   1.188 +      /* If the previous tail came from the same header as
   1.189 +       * the next item we want to append to our array, then, 
   1.190 +       * we merge them and attempt to reuse the previous tail's
   1.191 +       * location.
   1.192 +       */
   1.193 +      tailExtraItem.fragmentEnd = extraItem.fragmentEnd;
   1.194 +      // XXX This call might be wrong. 
   1.195 +      ReplaceTail (&tailItem, &tailExtraItem, tailSize);
   1.196 +      current = item.next;
   1.197 +    }
   1.198 +  else
   1.199 +    {
   1.200 +      current = o.m_head;
   1.201      }
   1.202  
   1.203 -  uint16_t current = o.m_head;
   1.204 +  /* Now that we have merged our current tail with the head of the
   1.205 +   * next packet, we just append all items from the next packet
   1.206 +   * to the current packet.
   1.207 +   */
   1.208    while (current != 0xffff)
   1.209      {
   1.210 -      struct PacketMetadata::SmallItem item;
   1.211 -      PacketMetadata::ExtraItem extraItem;
   1.212        o.ReadItems (current, &item, &extraItem);
   1.213 -      if (extraItem.packetUid == lastExtraItem.packetUid &&
   1.214 -          item.typeUid == lastItem.typeUid &&
   1.215 -          item.chunkUid == lastItem.chunkUid &&
   1.216 -          item.size == lastItem.size &&
   1.217 -          extraItem.fragmentStart == lastExtraItem.fragmentEnd)
   1.218 -        {
   1.219 -          // replace previous tail.
   1.220 -          lastExtraItem.fragmentEnd = extraItem.fragmentEnd;
   1.221 -          NS_ASSERT (m_tail == lastTail);
   1.222 -          // XXX This call might be wrong. 
   1.223 -          ReplaceTail (&lastItem, &lastExtraItem, lastTailSize);
   1.224 -        }
   1.225 -      else
   1.226 -        {
   1.227 -          // append the extra items.
   1.228 -          uint16_t written = AddBig (0xffff, m_tail, &item, &extraItem);
   1.229 -          UpdateTail (written);
   1.230 -        }
   1.231 +      uint16_t written = AddBig (0xffff, m_tail, &item, &extraItem);
   1.232 +      UpdateTail (written);
   1.233        if (current == o.m_tail)
   1.234          {
   1.235            break;
   1.236 @@ -826,6 +867,7 @@
   1.237  void 
   1.238  PacketMetadata::RemoveAtStart (uint32_t start)
   1.239  {
   1.240 +  NS_LOG_FUNCTION (this << start);
   1.241    if (!m_enable) 
   1.242      {
   1.243        m_metadataSkipped = true;
   1.244 @@ -891,6 +933,7 @@
   1.245  void 
   1.246  PacketMetadata::RemoveAtEnd (uint32_t end)
   1.247  {
   1.248 +  NS_LOG_FUNCTION (this << end);
   1.249    if (!m_enable) 
   1.250      {
   1.251        m_metadataSkipped = true;
   1.252 @@ -1069,6 +1112,7 @@
   1.253  uint32_t 
   1.254  PacketMetadata::GetSerializedSize (void) const
   1.255  {
   1.256 +  NS_LOG_FUNCTION (this);
   1.257    uint32_t totalSize = 0;
   1.258    totalSize += 4;
   1.259    if (!m_enable)
   1.260 @@ -1105,6 +1149,7 @@
   1.261  void 
   1.262  PacketMetadata::Serialize (Buffer::Iterator i, uint32_t size) const
   1.263  {
   1.264 +  NS_LOG_FUNCTION (this);
   1.265    uint32_t bytesWritten = 0;
   1.266    i.WriteU32 (size);
   1.267    bytesWritten += 4;
   1.268 @@ -1160,6 +1205,7 @@
   1.269  uint32_t 
   1.270  PacketMetadata::Deserialize (Buffer::Iterator i)
   1.271  {
   1.272 +  NS_LOG_FUNCTION (this);
   1.273    struct PacketMetadata::SmallItem item;
   1.274    struct PacketMetadata::ExtraItem extraItem;
   1.275    uint32_t totalSize = i.ReadU32 ();