12 #ifndef SST_CORE_MEMPOOL_H
13 #define SST_CORE_MEMPOOL_H
25 #include "sst/core/threadsafe.h"
35 template <
typename LOCK_t>
38 std::vector<void*> list;
40 inline void insert(
void *ptr) {
41 std::lock_guard<LOCK_t> lock(mtx);
45 inline void* try_remove() {
46 std::lock_guard<LOCK_t> lock(mtx);
47 if ( list.empty() )
return NULL;
48 void *p = list.back();
53 size_t size()
const {
return list.size(); }
62 MemPool(
size_t elementSize,
size_t initialSize=(2<<20)) :
64 elemSize(elementSize), arenaSize(initialSize),
72 for ( std::list<uint8_t*>::iterator i = arenas.begin() ; i != arenas.end() ; ++i ) {
80 void *ret = freeList.try_remove();
82 bool ok = allocPool();
83 if ( !ok )
return NULL;
85 ret = freeList.try_remove();
92 inline void free(
void *ptr)
107 uint64_t bytes_in_arenas = arenas.size() * arenaSize;
108 uint64_t bytes_in_free_list = freeList.size() *
sizeof(
void*);
109 return bytes_in_arenas + bytes_in_free_list;
112 uint64_t getUndeletedEntries() {
121 size_t getArenaSize()
const {
return arenaSize; }
122 size_t getElementSize()
const {
return elemSize; }
124 const std::list<uint8_t*>& getArenas() {
return arenas; }
131 if ( allocating.exchange(1, std::memory_order_acquire) ) {
135 uint8_t *newPool = (uint8_t*)mmap(0, arenaSize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
136 if ( MAP_FAILED == newPool ) {
137 allocating.store(0, std::memory_order_release);
140 std::memset(newPool, 0xFF, arenaSize);
141 arenas.push_back(newPool);
142 size_t nelem = arenaSize / elemSize;
143 for (
size_t i = 0 ; i < nelem ; i++ ) {
144 uint64_t* ptr = (uint64_t*)(newPool + (elemSize*i));
148 freeList.insert(ptr);
151 allocating.store(0, std::memory_order_release);
158 std::atomic<unsigned int> allocating;
159 FreeList<ThreadSafe::Spinlock> freeList;
160 std::list<uint8_t*> arenas;
MemPool(size_t elementSize, size_t initialSize=(2<< 20))
Create a new Memory Pool.
Definition: mempool.h:62
void free(void *ptr)
Return an element to the memory pool.
Definition: mempool.h:92
void * malloc()
Allocate a new element from the memory pool.
Definition: mempool.h:78
std::atomic< uint64_t > numAlloc
Counter: Number of times elements have been allocated.
Definition: mempool.h:117
uint64_t getBytesMemUsed()
Approximates the current memory usage of the mempool.
Definition: mempool.h:106
std::atomic< uint64_t > numFree
Counter: Number times elements have been freed.
Definition: mempool.h:119
Simple Memory Pool class.
Definition: mempool.h:33