5 #include "ns3/assert.h"
10 #ifdef HAVE_VALGRIND_H
11 # include "valgrind/valgrind.h"
12 # include "valgrind/memcheck.h"
13 # define REPORT_MALLOC(buffer, size) \
14 VALGRIND_MALLOCLIKE_BLOCK (buffer,size, 0, 0)
15 # define REPORT_FREE(buffer) \
16 VALGRIND_FREELIKE_BLOCK (buffer, 0)
17 # define MARK_DEFINED(buffer, size) \
18 VALGRIND_MAKE_MEM_DEFINED (buffer, size)
19 # define MARK_UNDEFINED(buffer, size) \
20 VALGRIND_MAKE_MEM_UNDEFINED (buffer, size)
22 # define REPORT_MALLOC(buffer, size)
23 # define REPORT_FREE(buffer)
24 # define MARK_DEFINED(buffer, size)
25 # define MARK_UNDEFINED(buffer, size)
30 : m_defaultMmapSize (1 << 15)
32 NS_LOG_FUNCTION (
this);
37 NS_LOG_FUNCTION (
this);
39 for (std::list<struct KingsleyAlloc::MmapChunk>::iterator i =
m_chunks.begin ();
50 if (i->copy == i->mmap->current)
58 if (i->mmap->refcount == 0)
62 MmapFree (i->mmap->buffer, i->mmap->size);
72 NS_LOG_FUNCTION (
this);
73 for (std::list<struct KingsleyAlloc::MmapChunk>::iterator i =
m_chunks.begin ();
76 if (i->copy == i->mmap->current)
86 NS_LOG_FUNCTION (
this <<
"begin");
89 for (std::list<struct KingsleyAlloc::MmapChunk>::iterator i =
m_chunks.begin ();
102 chunkClone.
copy = (uint8_t *)malloc (chunkClone.
mmap->
size);
105 clone->
m_chunks.push_back (chunkClone);
107 NS_LOG_FUNCTION (
this <<
"end");
114 NS_LOG_FUNCTION (
this);
115 for (std::list<struct KingsleyAlloc::MmapChunk>::const_iterator i =
m_chunks.begin ();
139 NS_LOG_FUNCTION (
this << (
void*)buffer << size);
141 status = ::munmap (buffer, size);
142 NS_ASSERT_MSG (status == 0,
"Unable to release mmaped buffer");
147 NS_LOG_FUNCTION (
this << size);
148 struct Mmap *mmap_struct =
new Mmap ();
150 mmap_struct->
size = size;
151 mmap_struct->
buffer = (uint8_t*)::mmap (0, size, PROT_READ | PROT_WRITE,
152 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
153 NS_ASSERT_MSG (mmap_struct->
buffer != MAP_FAILED,
"Unable to mmap memory buffer");
156 chunk.
mmap = mmap_struct;
161 NS_LOG_DEBUG (
"mmap alloced=" << size <<
" at=" << (
void*)mmap_struct->
buffer);
168 NS_LOG_FUNCTION (
this << needed);
169 for (std::list<struct KingsleyAlloc::MmapChunk>::iterator i =
m_chunks.begin ();
172 NS_ASSERT (i->mmap->size >= i->brk);
173 if (i->mmap->size - i->brk >= needed)
175 uint8_t *buffer = i->mmap->buffer + i->brk;
177 NS_LOG_DEBUG (
"brk: needed=" << needed <<
", left=" << i->mmap->size - i->brk);
188 NS_LOG_FUNCTION (
this << sz);
197 NS_ASSERT (bucket < 32);
198 NS_LOG_DEBUG (
"size=" << sz <<
", bucket=" << (uint32_t)bucket <<
", size=" <<
205 uint32_t size = (1 << (bucket + 3));
212 NS_LOG_FUNCTION (
this << size);
230 return (uint8_t*)avail;
235 uint8_t *buffer =
Brk (size);
243 NS_LOG_FUNCTION (
this << (
void*)buffer << size);
255 for (std::list<struct KingsleyAlloc::MmapChunk>::iterator i =
m_chunks.begin ();
258 if (i->mmap->buffer == buffer && i->mmap->size == size)
273 NS_LOG_FUNCTION (
this << (
void*)oldBuffer << oldSize << newSize);
274 if (newSize < oldSize)
278 uint8_t *newBuffer =
Malloc (newSize);
279 memcpy (newBuffer, oldBuffer, oldSize);
280 Free (oldBuffer, oldSize);