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