12 #ifndef SST_CORE_MEMPOOL_H
13 #define SST_CORE_MEMPOOL_H
15 #include "sst/core/threadsafe.h"
34 template <
typename LOCK_t>
38 std::vector<void*> list;
41 inline void insert(
void* ptr)
43 std::lock_guard<LOCK_t> lock(mtx);
47 inline void* try_remove()
49 std::lock_guard<LOCK_t> lock(mtx);
50 if ( list.empty() )
return nullptr;
51 void* p = list.back();
56 size_t size()
const {
return list.size(); }
64 MemPool(
size_t elementSize,
size_t initialSize = (2 << 20)) :
67 elemSize(elementSize),
68 arenaSize(initialSize),
76 for ( std::list<uint8_t*>::iterator i = arenas.begin(); i != arenas.end(); ++i ) {
84 void* ret = freeList.try_remove();
86 bool ok = allocPool();
87 if ( !ok )
return nullptr;
89 ret = freeList.try_remove();
96 inline void free(
void* ptr)
112 uint64_t bytes_in_arenas = arenas.size() * arenaSize;
113 uint64_t bytes_in_free_list = freeList.size() *
sizeof(
void*);
114 return bytes_in_arenas + bytes_in_free_list;
124 size_t getArenaSize()
const {
return arenaSize; }
125 size_t getElementSize()
const {
return elemSize; }
127 const std::list<uint8_t*>& getArenas() {
return arenas; }
133 if ( allocating.exchange(1, std::memory_order_acquire) ) {
return true; }
135 uint8_t* newPool = (uint8_t*)mmap(
nullptr, 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;
166 #endif // SST_CORE_MEMPOOL_H
MemPool(size_t elementSize, size_t initialSize=(2<< 20))
Create a new Memory Pool.
Definition: mempool.h:64
void free(void *ptr)
Return an element to the memory pool.
Definition: mempool.h:96
void * malloc()
Allocate a new element from the memory pool.
Definition: mempool.h:82
std::atomic< uint64_t > numAlloc
Counter: Number of times elements have been allocated.
Definition: mempool.h:120
uint64_t getBytesMemUsed()
Approximates the current memory usage of the mempool.
Definition: mempool.h:110
std::atomic< uint64_t > numFree
Counter: Number times elements have been freed.
Definition: mempool.h:122
Simple Memory Pool class.
Definition: mempool.h:32