Backed out changeset 9fa2f44cdafa
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Fri, 11 Apr 2008 11:29:49 -0700
changeset 2908 4ebd61a5612c
parent 2905 9fa2f44cdafa
child 2909 30c9b48a3af3
Backed out changeset 9fa2f44cdafa
src/common/tags.cc
src/common/tags.h
--- a/src/common/tags.cc	Thu Apr 10 14:08:14 2008 -0700
+++ b/src/common/tags.cc	Fri Apr 11 11:29:49 2008 -0700
@@ -20,29 +20,59 @@
 #include "tags.h"
 #include <string.h>
 #include "ns3/fatal-error.h"
-#include "ns3/log.h"
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Tags");
+#ifdef USE_FREE_LIST
+
+struct Tags::TagData *Tags::gFree = 0;
+uint32_t Tags::gN_free = 0;
 
 struct Tags::TagData *
-Tags::AllocData (uint32_t size) const
+Tags::AllocData (void) const
 {
   struct Tags::TagData *retval;
-  retval = new struct Tags::TagData ();
-  retval->m_data = new uint8_t [size];
-  NS_LOG_DEBUG ("alloc " << retval << " in " << (int *)retval->m_data);
+  if (gFree != 0) 
+    {
+      retval = gFree;
+      gFree = gFree->m_next;
+      gN_free--;
+    } 
+  else 
+    {
+      retval = new struct Tags::TagData ();
+    }
   return retval;
 }
 
 void
 Tags::FreeData (struct TagData *data) const
 {
-  NS_LOG_DEBUG ("free " << data << " in " << (int *)data->m_data);
-  delete [] data->m_data;
+  if (gN_free > 1000) 
+    {
+      delete data;
+      return;
+    }
+  gN_free++;
+  data->m_next = gFree;
+  data->m_id = 0;
+  gFree = data;
+}
+#else
+struct Tags::TagData *
+Tags::AllocData (void) const
+{
+  struct Tags::TagData *retval;
+  retval = new struct Tags::TagData ();
+  return retval;
+}
+
+void
+Tags::FreeData (struct TagData *data) const
+{
   delete data;
 }
+#endif
 
 bool
 Tags::Remove (uint32_t id)
@@ -73,7 +103,7 @@
            */
           continue;
         }
-      struct TagData *copy = AllocData (Tags::SIZE);
+      struct TagData *copy = AllocData ();
       copy->m_id = cur->m_id;
       copy->m_count = 1;
       copy->m_next = 0;
@@ -153,7 +183,7 @@
         }
       bytesRead += uidStringSize;
       uint32_t uid = TagRegistry::GetUidFromUidString (uidString);
-      struct TagData *newStart = AllocData (Tags::SIZE);
+      struct TagData *newStart = AllocData ();
       newStart->m_count = 1;
       newStart->m_next = 0;
       newStart->m_id = uid;
--- a/src/common/tags.h	Thu Apr 10 14:08:14 2008 -0700
+++ b/src/common/tags.h	Fri Apr 11 11:29:49 2008 -0700
@@ -63,16 +63,19 @@
   };
 private:
   struct TagData {
-    struct TagData *m_next;
-    uint32_t m_id;
-    uint32_t m_count;
-    uint8_t *m_data;
+      uint8_t m_data[Tags::SIZE];
+      struct TagData *m_next;
+      uint32_t m_id;
+      uint32_t m_count;
   };
 
   bool Remove (uint32_t id);
-  struct Tags::TagData *AllocData (uint32_t size) const;
+  struct Tags::TagData *AllocData (void) const;
   void FreeData (struct TagData *data) const;
 
+  static struct Tags::TagData *gFree;
+  static uint32_t gN_free;
+
   struct TagData *m_next;
 };
 
@@ -105,11 +108,11 @@
     {
       NS_ASSERT (cur->m_id != T::GetUid ());
     }
-  struct TagData *newStart = AllocData (Tags::SIZE);
+  struct TagData *newStart = AllocData ();
   newStart->m_count = 1;
   newStart->m_next = 0;
   newStart->m_id = T::GetUid ();
-  void *buf = newStart->m_data;
+  void *buf = &newStart->m_data;
   new (buf) T (tag);
   newStart->m_next = m_next;
   const_cast<Tags *> (this)->m_next = newStart;
@@ -149,7 +152,7 @@
       if (cur->m_id == T::GetUid ()) 
         {
           /* found tag */
-          T *data = reinterpret_cast<T *> (cur->m_data);
+          T *data = reinterpret_cast<T *> (&cur->m_data);
           tag = T (*data);
           return true;
         }