Remove free list from PacketTagList. ptl
authorPeter D. Barnes, Jr. <barnes26@llnl.gov>
Tue, 13 Nov 2012 23:51:56 -0800
branchptl
changeset 9764 e5258de9a86c
parent 9763 038d5627c5a9
child 9765 10939fed92c8
Remove free list from PacketTagList.
src/lte/model/lte-radio-bearer-tag.cc
src/lte/model/lte-radio-bearer-tag.h
src/lte/model/lte-rlc-um.cc
src/lte/model/lte-rlc-um.h
src/network/model/packet-tag-list.cc
src/network/model/packet-tag-list.h
src/network/test/packet-test-suite.cc
--- a/src/network/model/packet-tag-list.cc	Tue Nov 13 23:44:58 2012 -0800
+++ b/src/network/model/packet-tag-list.cc	Tue Nov 13 23:51:56 2012 -0800
@@ -34,66 +34,6 @@
 
 namespace ns3 {
 
-#ifndef USE_FREE_LIST
-#define USE_FREE_LIST 0
-#endif
- 
-#if USE_FREE_LIST
-
-struct PacketTagList::TagData * PacketTagList::g_free = 0;
-uint32_t PacketTagList::g_nfree = 0;
- 
-struct PacketTagList::TagData *
-PacketTagList::AllocData (void) const
-{
-  NS_LOG_FUNCTION (g_nfree);
-  struct TagData * retval;
-  if (g_free != 0) 
-    {
-      retval = g_free;
-      g_free = g_free->next;
-      g_nfree--;
-    } 
-  else 
-    {
-      retval = new struct TagData ();
-    }
-  return retval;
-}
-
-void
-PacketTagList::FreeData (struct TagData *data) const
-{
-  NS_LOG_FUNCTION (g_nfree << data);
-  if (g_nfree > FREE_LIST_MAX) 
-    {
-      delete data;
-      return;
-    }
-  g_nfree++;
-  data->next = g_free;
-  g_free = data;
-  memset (data->data, 0, TagData::MAX_SIZE);
-  data->tid = TypeId ();
-  data->count = 0;
-}
-#else  // if USE_FREE_LIST
-
-struct PacketTagList::TagData *
-PacketTagList::AllocData (void) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  return new struct TagData ();
-}
-
-void
-PacketTagList::FreeData (struct TagData *data) const
-{
-  NS_LOG_FUNCTION (data);
-  delete data;
-}
-#endif  // if USE_FREE_LIST
-
 bool
 PacketTagList::COWTraverse (Tag & tag, PacketTagList::COWWriter_fp Writer)
 {
@@ -193,7 +133,7 @@
       NS_ASSERT (cur != 0);
       NS_ASSERT (cur->count > 1);
       cur->count--;                       // unmerge cur
-      struct TagData * copy = AllocData ();
+      struct TagData * copy = new struct TagData ();
       copy->tid = cur->tid;
       copy->count = 1;
       memcpy (copy->data, cur->data, TagData::MAX_SIZE);
@@ -237,7 +177,7 @@
   if (preMerge)
     {
       // found tid before first merge, so delete cur
-      FreeData (cur);
+      delete cur;
     }
   else
     {
@@ -285,7 +225,7 @@
       // cur is always a merge at this point
       // need to copy, replace, and link past cur
       cur->count--;                     // unmerge cur
-      struct TagData * copy = AllocData ();
+      struct TagData * copy = new struct TagData ();
       copy->tid = tag.GetInstanceTypeId ();
       copy->count = 1;
       tag.Serialize (TagBuffer (copy->data,
@@ -309,7 +249,7 @@
     {
       NS_ASSERT (cur->tid != tag.GetInstanceTypeId ());
     }
-  struct TagData * head = AllocData ();
+  struct TagData * head = new struct TagData ();
   head->count = 1;
   head->next = 0;
   head->tid = tag.GetInstanceTypeId ();
--- a/src/network/model/packet-tag-list.h	Tue Nov 13 23:44:58 2012 -0800
+++ b/src/network/model/packet-tag-list.h	Tue Nov 13 23:51:56 2012 -0800
@@ -123,12 +123,6 @@
  *
  * \par <b> Memory Management: </b>
  * \n
- * If the preprocessor symbol \link packet-tag-list.cc#USE_FREE_LIST
- * \c USE_FREE_LIST \endlink is true, #FreeData'd #TagData's
- * are added to the static free list #g_free.  The free list size is bounded.
- * Using the free list avoids \c new'ing and \c delete'ing #TagData's
- * every time a tag is added/removed from a PacketTagList.
- * \n\n
  * Packet tags must serialize to a finite maximum size, see #TagData
  *
  * This documentation entitles the original author to a free beer.
@@ -153,8 +147,7 @@
      * in this constant.
      *
      * \intern
-     * Ideally, #TagData would be 32 bytes in size, so they
-     * can be added/removed from a single free list, and require
+     * Ideally, #TagData would be 32 bytes in size, so they require
      * no padding on 64-bit architectures.  (The architecture
      * affects the size because of the \c #next pointer.)
      * This would leave 18 bytes for \c #data.  However,
@@ -185,7 +178,7 @@
    * \param [in] o The PacketTagList to copy.
    *
    * This makes a light-weight copy by #RemoveAll, then
-   * pointing to the same #TagData as \pname{o}.
+   * pointing to the same #struct TagData as \pname{o}.
    */
   inline PacketTagList (PacketTagList const &o);
   /**
@@ -194,7 +187,7 @@
    * \param [in] o The PacketTagList to copy.
    *
    * This makes a light-weight copy by #RemoveAll, then
-   * pointing to the same #TagData as \pname{o}.
+   * pointing to the same #struct TagData as \pname{o}.
    */
   inline PacketTagList &operator = (PacketTagList const &o);
   /**
@@ -247,15 +240,6 @@
 
 private:
   /**
-   * \returns A pointer to a new #TagData
-   */
-  struct TagData * AllocData (void) const;
-  /**
-   * Free a #TagData, adding it to the free list.
-   */
-  void FreeData (struct TagData * data) const;
-
-  /**
    * Typedef of method function pointer for copy-on-write operations
    *
    * \param [in] tag The tag type to operate on.
@@ -303,15 +287,10 @@
    */
   bool ReplaceWriter (Tag & tag, bool preMerge, struct TagData * cur, struct TagData ** prevNext);
 
-  enum PacketTagList_e
-  {
-    FREE_LIST_MAX = 1000      /**< Maximum size of free list */
-  };
-
-  static struct TagData * g_free;  /**< Head of #TagData free list */
-  static uint32_t g_nfree; /**< Number of #TagData's on the free list */
-
-  struct TagData * m_next;  /**< Pointer to first #TagData on the list */
+  /**
+   * Pointer to first #struct TagData on the list
+   */
+  struct TagData *m_next;
 };
 
 } // namespace ns3
@@ -371,13 +350,13 @@
         }
       if (prev != 0) 
         {
-          FreeData (prev);
+	  delete prev;
         }
       prev = cur;
     }
   if (prev != 0) 
     {
-      FreeData (prev);
+      delete prev;
     }
   m_next = 0;
 }
--- a/src/network/test/packet-test-suite.cc	Tue Nov 13 23:44:58 2012 -0800
+++ b/src/network/test/packet-test-suite.cc	Tue Nov 13 23:51:56 2012 -0800
@@ -630,7 +630,9 @@
   ReplaceCheck (7);
 
   std::cout << GetName () << "freelist timing" << std::endl;
+  for (int i = 0; i < 100; ++i) {
   AddRemoveTime ();
+  }
   
   std::cout << GetName () << "remove timing" << std::endl;
   RemoveTime (ref, t7, "t7");