allocate/deallocate buffer by hand.
This commit is contained in:
@@ -20,59 +20,29 @@
|
||||
#include "tags.h"
|
||||
#include <string.h>
|
||||
#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;
|
||||
|
||||
@@ -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<Tags *> (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<T *> (&cur->m_data);
|
||||
T *data = reinterpret_cast<T *> (cur->m_data);
|
||||
tag = T (*data);
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user