From 3211fbb0bfa265699386cc2cbe89645694b3345a Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 10 Apr 2008 14:08:14 -0700 Subject: [PATCH] allocate/deallocate buffer by hand. --- src/common/tags.cc | 48 +++++++++------------------------------------- src/common/tags.h | 19 ++++++++---------- 2 files changed, 17 insertions(+), 50 deletions(-) diff --git a/src/common/tags.cc b/src/common/tags.cc index a719417a4..ce1059cfb 100644 --- a/src/common/tags.cc +++ b/src/common/tags.cc @@ -20,59 +20,29 @@ #include "tags.h" #include #include "ns3/fatal-error.h" +#include "ns3/log.h" namespace ns3 { -#ifdef USE_FREE_LIST - -struct Tags::TagData *Tags::gFree = 0; -uint32_t Tags::gN_free = 0; +NS_LOG_COMPONENT_DEFINE ("Tags"); struct Tags::TagData * -Tags::AllocData (void) const -{ - struct Tags::TagData *retval; - 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 -{ - 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 +Tags::AllocData (uint32_t size) 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); return retval; } void Tags::FreeData (struct TagData *data) const { + NS_LOG_DEBUG ("free " << data << " in " << (int *)data->m_data); + delete [] data->m_data; delete data; } -#endif bool Tags::Remove (uint32_t id) @@ -103,7 +73,7 @@ Tags::Remove (uint32_t id) */ continue; } - struct TagData *copy = AllocData (); + struct TagData *copy = AllocData (Tags::SIZE); copy->m_id = cur->m_id; copy->m_count = 1; copy->m_next = 0; @@ -183,7 +153,7 @@ Tags::Deserialize (Buffer::Iterator i) } bytesRead += uidStringSize; uint32_t uid = TagRegistry::GetUidFromUidString (uidString); - struct TagData *newStart = AllocData (); + struct TagData *newStart = AllocData (Tags::SIZE); newStart->m_count = 1; newStart->m_next = 0; newStart->m_id = uid; diff --git a/src/common/tags.h b/src/common/tags.h index a88b6a6e0..9e156aaae 100644 --- a/src/common/tags.h +++ b/src/common/tags.h @@ -63,19 +63,16 @@ public: }; private: struct TagData { - uint8_t m_data[Tags::SIZE]; - struct TagData *m_next; - uint32_t m_id; - uint32_t m_count; + struct TagData *m_next; + uint32_t m_id; + uint32_t m_count; + uint8_t *m_data; }; bool Remove (uint32_t id); - struct Tags::TagData *AllocData (void) const; + struct Tags::TagData *AllocData (uint32_t size) const; void FreeData (struct TagData *data) const; - static struct Tags::TagData *gFree; - static uint32_t gN_free; - struct TagData *m_next; }; @@ -108,11 +105,11 @@ Tags::Add (T const&tag) const { NS_ASSERT (cur->m_id != T::GetUid ()); } - struct TagData *newStart = AllocData (); + struct TagData *newStart = AllocData (Tags::SIZE); 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 (this)->m_next = newStart; @@ -152,7 +149,7 @@ Tags::Peek (T &tag) const if (cur->m_id == T::GetUid ()) { /* found tag */ - T *data = reinterpret_cast (&cur->m_data); + T *data = reinterpret_cast (cur->m_data); tag = T (*data); return true; }