5#include <boost/pool/object_pool.hpp>
47 void*
malloc_n(
const size_t n,
const size_t partition_size);
48 void add_ordered_block(
void*
const block,
const size_t nsz,
const size_t npartition_sz);
49 void ordered_free_n(
void*
const chunks,
const size_t n,
const size_t partition_size);
78 ApraNode(
char *
const nptr,
const size_t nsize)
92 return (
begin() != 0);
126template <
typename UserAllocator>
130 explicit ApraPool(
const size_t nRequestedSize,
const size_t nnext_size = 32,
const size_t nmax_size = 0);
140 bool is_from(
void*
const chunk,
char*
const start,
char*
const end);
160template <
typename UserAllocator>
166template <
typename UserAllocator>
172template <
typename UserAllocator>
181 while (
list !=
nullptr)
184 (UserAllocator::free)(
list->begin());
196template <
typename UserAllocator>
207 while (ptr !=
nullptr)
210 if (free_chunk ==
nullptr)
215 bool all_chunks_free =
true;
221 if (i != free_chunk->
get())
223 all_chunks_free =
false;
225 free_chunk = saved_free;
232 last_free = free_chunk;
235 free_chunk = free_chunk->
getNext();
240 if (!all_chunks_free)
244 std::less<void *> lt;
245 void*
const end = node.
end();
248 prev_free_chunk = free_chunk;
249 free_chunk = free_chunk->
getNext();
250 }
while (free_chunk && lt(free_chunk->
get(), end));
268 if (prev_free_chunk !=
nullptr)
270 prev_free_chunk->
setNext(free_chunk);
274 this->
first = free_chunk;
279 (UserAllocator::free)(node.
begin());
291template <
typename UserAllocator>
294 std::less_equal<void *> lt_eq;
295 std::less<void *> lt;
296 return (lt_eq(start, chunk) && lt(chunk, end));
299template <
typename UserAllocator>
304 if ((ret != 0) || (num_chunks == 0))
312 char * ptr = (UserAllocator::malloc)(POD_size);
322 ptr = (UserAllocator::malloc)(POD_size);
349 if (
list ==
nullptr || std::greater<void *>()(
list->begin(), node->
begin()))
374 return node->
begin();
377template <
typename UserAllocator>
void set(void *_ptr, ApraChunk *_next)
Definition ApraPool.h:15
void setNext(ApraChunk *_next)
Definition ApraPool.h:21
void * get()
Definition ApraPool.h:26
ApraChunk * getNext()
Definition ApraPool.h:31
ApraChunk()
Definition ApraPool.h:10
ApraChunk * next
Definition ApraPool.h:38
void * ptr
Definition ApraPool.h:37
char * ptr
Definition ApraPool.h:71
char * end() const
Definition ApraPool.h:106
void invalidate()
Definition ApraPool.h:94
size_t total_size() const
Definition ApraPool.h:110
char * end_ptr
Definition ApraPool.h:72
size_t sz
Definition ApraPool.h:73
~ApraNode()
Definition ApraPool.h:83
ApraNode * getNext()
Definition ApraPool.h:115
ApraNode * next
Definition ApraPool.h:75
bool valid() const
Definition ApraPool.h:90
char * begin() const
Definition ApraPool.h:102
ApraNode(char *const nptr, const size_t nsize)
Definition ApraPool.h:78
char *& begin()
Definition ApraPool.h:98
void setNext(ApraNode *_next)
Definition ApraPool.h:120
bool purge_memory()
Definition ApraPool.h:173
const ApraSegregatedStorage & store() const
Definition ApraPool.h:146
void ordered_free(void *ptr, const size_t n)
Definition ApraPool.h:378
size_t next_size
Definition ApraPool.h:153
ApraPool(const size_t nRequestedSize, const size_t nnext_size=32, const size_t nmax_size=0)
Definition ApraPool.h:161
size_t max_size
Definition ApraPool.h:154
virtual ~ApraPool()
Definition ApraPool.h:167
boost::object_pool< ApraNode > node_opool
Definition ApraPool.h:157
const size_t requested_size
Definition ApraPool.h:151
ApraNode * list
Definition ApraPool.h:156
bool release_memory()
Definition ApraPool.h:197
bool is_from(void *const chunk, char *const start, char *const end)
Definition ApraPool.h:292
void * ordered_malloc(const size_t n)
Definition ApraPool.h:300
ApraSegregatedStorage & store()
Definition ApraPool.h:142
size_t start_size
Definition ApraPool.h:152
boost::object_pool< ApraChunk > chunk_opool
Definition ApraPool.h:65
ApraSegregatedStorage()
Definition ApraPool.cpp:3
ApraChunk * try_malloc_n(ApraChunk *&start, size_t n, const size_t partition_size)
Definition ApraPool.cpp:117
ApraChunk * find_prev(void *const ptr)
Definition ApraPool.cpp:98
void * malloc_n(const size_t n, const size_t partition_size)
Definition ApraPool.cpp:133
void releaseChunks()
Definition ApraPool.cpp:13
ApraChunk * segregate(void *block, size_t sz, size_t partition_sz, ApraChunk *end=nullptr)
Definition ApraPool.cpp:67
void add_ordered_block(void *const block, const size_t nsz, const size_t npartition_sz)
Definition ApraPool.cpp:44
virtual ~ApraSegregatedStorage()
Definition ApraPool.cpp:8
void addToJunk(ApraChunk *start, ApraChunk *end)
Definition ApraPool.cpp:18
bool empty() const
Definition ApraPool.cpp:39
ApraChunk * first
Definition ApraPool.h:63
ApraChunk * getFreeApraChunk()
Definition ApraPool.cpp:24
ApraChunk * junkList
Definition ApraPool.h:64
void ordered_free_n(void *const chunks, const size_t n, const size_t partition_size)
Definition ApraPool.cpp:59