add failing test and fix for assignment to self
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 05 Sep 2007 16:28:55 +0200
changeset 1312 8bc3f26344b9
parent 1311 5710e4388a79
child 1313 02b29b3d74de
child 1737 e72c130c3a59
add failing test and fix for assignment to self
src/common/packet-metadata-test.cc
src/common/packet-metadata.h
--- a/src/common/packet-metadata-test.cc	Wed Aug 29 12:32:18 2007 +0100
+++ b/src/common/packet-metadata-test.cc	Wed Sep 05 16:28:55 2007 +0200
@@ -217,6 +217,7 @@
   template <int N>
   void RegisterTrailer (void);
   void CleanupPrints (void);
+  Packet DoAddHeader (Packet p);
   bool Check (const char *file, int line, std::list<int> expected);
 
 
@@ -430,6 +431,14 @@
       }                                         \
   }
 
+
+Packet 
+PacketMetadataTest::DoAddHeader (Packet p)
+{
+  ADD_HEADER (p, 10);
+  return p;
+}
+
 bool
 PacketMetadataTest::RunTests (void)
 {
@@ -659,6 +668,11 @@
   ADD_HEADER (p, 10);
   CHECK_HISTORY (p, 1, 10);
 
+  p = Packet ();
+  ADD_HEADER (p, 10);
+  p = DoAddHeader (p);
+  CHECK_HISTORY (p, 2, 10, 10);
+
   return ok;
 }
 
--- a/src/common/packet-metadata.h	Wed Aug 29 12:32:18 2007 +0100
+++ b/src/common/packet-metadata.h	Wed Sep 05 16:28:55 2007 +0200
@@ -306,24 +306,23 @@
 PacketMetadata &
 PacketMetadata::operator = (PacketMetadata const& o)
 {
-  if (m_data == o.m_data) 
+  if (m_data != o.m_data) 
     {
-      // self assignment
-      return *this;
+      // not self assignment
+      NS_ASSERT (m_data != 0);
+      m_data->m_count--;
+      if (m_data->m_count == 0) 
+        {
+          PacketMetadata::Recycle (m_data);
+        }
+      m_data = o.m_data;
+      NS_ASSERT (m_data != 0);
+      m_data->m_count++;
     }
-  NS_ASSERT (m_data != 0);
-  m_data->m_count--;
-  if (m_data->m_count == 0) 
-    {
-      PacketMetadata::Recycle (m_data);
-    }
-  m_data = o.m_data;
   m_head = o.m_head;
   m_tail = o.m_tail;
   m_used = o.m_used;
   m_packetUid = o.m_packetUid;
-  NS_ASSERT (m_data != 0);
-  m_data->m_count++;
   return *this;
 }
 PacketMetadata::~PacketMetadata ()