Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

PoolMemoryAllocator.h
Go to the documentation of this file.
1 
33 #pragma once
34 
35 #include <ogdf/basic/System.h>
36 
37 #ifndef OGDF_MEMORY_POOL_NTS
38 # include <mutex>
39 #endif
40 
41 namespace ogdf {
42 
44 
57  struct MemElem {
59  };
60 
61  using MemElemPtr = MemElem*;
62 
63  struct PoolElement;
64  struct BlockChain;
65 
66  static constexpr size_t MIN_BYTES = sizeof(MemElemPtr);
67  static constexpr size_t TABLE_SIZE = 256;
68  static constexpr size_t BLOCK_SIZE = 8192;
69 
70 public:
72 
74 
76  static OGDF_EXPORT void cleanup();
77 
79  static OGDF_EXPORT bool checkSize(size_t nBytes);
80 
82  static OGDF_EXPORT void* allocate(size_t nBytes);
83 
85  static OGDF_EXPORT void deallocate(size_t nBytes, void* p);
86 
88 
93  static OGDF_EXPORT void deallocateList(size_t nBytes, void* pHead, void* pTail);
94 
96  static OGDF_EXPORT void flushPool();
97 
99  static OGDF_EXPORT size_t memoryAllocatedInBlocks();
100 
102  static OGDF_EXPORT size_t memoryInGlobalFreeList();
103 
105  static OGDF_EXPORT size_t memoryInThreadFreeList();
106 
114  static OGDF_EXPORT void defrag();
115 
116 private:
117  static inline void enterCS() {
118 #ifndef OGDF_MEMORY_POOL_NTS
119  s_mutex.lock();
120 #endif
121  }
122 
123  static inline void leaveCS() {
124 #ifndef OGDF_MEMORY_POOL_NTS
125  s_mutex.unlock();
126 #endif
127  }
128 
129  static int slicesPerBlock(uint16_t nBytes) {
130  int nWords;
131  return slicesPerBlock(nBytes, nWords);
132  }
133 
134  static int slicesPerBlock(uint16_t nBytes, int& nWords) {
135  nWords = (nBytes + OGDF_SIZEOF_POINTER - 1) / OGDF_SIZEOF_POINTER;
136  return (BLOCK_SIZE - OGDF_SIZEOF_POINTER) / (nWords * OGDF_SIZEOF_POINTER);
137  }
138 
139  static void* fillPool(MemElemPtr& pFreeBytes, uint16_t nBytes);
140 
141  static MemElemPtr allocateBlock();
142  static void makeSlices(MemElemPtr p, int nWords, int nSlices);
143 
144  static size_t unguardedMemGlobalFreelist();
145 
148  static PoolElement s_pool[TABLE_SIZE];
149 
151  static BlockChain* s_blocks;
152 
153 #ifdef OGDF_DEBUG
154  static long long s_globallyAllocatedBytes;
157  static thread_local long long s_locallyAllocatedBytes;
158 #endif
159 
160 #ifdef OGDF_MEMORY_POOL_NTS
161  static MemElemPtr s_tp[TABLE_SIZE];
162 #else
163  static std::mutex s_mutex;
165  static thread_local MemElemPtr s_tp[TABLE_SIZE];
166 #endif
167 };
168 
169 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::PoolMemoryAllocator::deallocateList
static void deallocateList(size_t nBytes, void *pHead, void *pTail)
Deallocate a complete list starting at pHead and ending at pTail.
ogdf::PoolMemoryAllocator::PoolMemoryAllocator
PoolMemoryAllocator()
Definition: PoolMemoryAllocator.h:71
ogdf::PoolMemoryAllocator::slicesPerBlock
static int slicesPerBlock(uint16_t nBytes, int &nWords)
Definition: PoolMemoryAllocator.h:134
ogdf::PoolMemoryAllocator::MemElem
Basic memory element used to realize a linked list of deallocated memory segments.
Definition: PoolMemoryAllocator.h:57
ogdf::PoolMemoryAllocator::memoryInThreadFreeList
static size_t memoryInThreadFreeList()
Returns the total amount of memory (in bytes) available in the thread's free lists.
System.h
Decalration of System class which provides unified access to system information.
ogdf::PoolMemoryAllocator::defrag
static void defrag()
Defragments the global free lists.
ogdf::PoolMemoryAllocator::s_locallyAllocatedBytes
static thread_local long long s_locallyAllocatedBytes
Holds the number of thread-locally allocated bytes for debugging.
Definition: PoolMemoryAllocator.h:157
ogdf::PoolMemoryAllocator::allocateBlock
static MemElemPtr allocateBlock()
ogdf::PoolMemoryAllocator::allocate
static void * allocate(size_t nBytes)
Allocates memory of size nBytes.
ogdf::PoolMemoryAllocator::memoryInGlobalFreeList
static size_t memoryInGlobalFreeList()
Returns the total amount of memory (in bytes) available in the global free lists.
ogdf::PoolMemoryAllocator::memoryAllocatedInBlocks
static size_t memoryAllocatedInBlocks()
Returns the total amount of memory (in bytes) allocated from the system.
ogdf::PoolMemoryAllocator::~PoolMemoryAllocator
~PoolMemoryAllocator()
Definition: PoolMemoryAllocator.h:73
ogdf::PoolMemoryAllocator::enterCS
static void enterCS()
Definition: PoolMemoryAllocator.h:117
ogdf::PoolMemoryAllocator::makeSlices
static void makeSlices(MemElemPtr p, int nWords, int nSlices)
ogdf::PoolMemoryAllocator::deallocate
static void deallocate(size_t nBytes, void *p)
Deallocates memory at address p which is of size nBytes.
OGDF_SIZEOF_POINTER
#define OGDF_SIZEOF_POINTER
The size of a pointer.
Definition: config_autogen.h:25
ogdf::PoolMemoryAllocator::cleanup
static void cleanup()
Frees all allocated memory.
ogdf::PoolMemoryAllocator::TABLE_SIZE
static constexpr size_t TABLE_SIZE
Definition: PoolMemoryAllocator.h:67
ogdf::PoolMemoryAllocator::leaveCS
static void leaveCS()
Definition: PoolMemoryAllocator.h:123
ogdf::PoolMemoryAllocator::unguardedMemGlobalFreelist
static size_t unguardedMemGlobalFreelist()
ogdf::PoolMemoryAllocator::s_globallyAllocatedBytes
static long long s_globallyAllocatedBytes
Holds the number of globally allocated bytes for debugging.
Definition: PoolMemoryAllocator.h:155
ogdf::PoolMemoryAllocator::slicesPerBlock
static int slicesPerBlock(uint16_t nBytes)
Definition: PoolMemoryAllocator.h:129
ogdf::PoolMemoryAllocator::s_mutex
static std::mutex s_mutex
Definition: PoolMemoryAllocator.h:163
ogdf::PoolMemoryAllocator
Allocates memory in large chunks for better runtime.
Definition: PoolMemoryAllocator.h:55
ogdf::PoolMemoryAllocator::flushPool
static void flushPool()
Flushes all free but allocated bytes (s_tp) to the thread-global list (s_pool) of allocated bytes.
ogdf::PoolMemoryAllocator::BLOCK_SIZE
static constexpr size_t BLOCK_SIZE
Definition: PoolMemoryAllocator.h:68
ogdf::PoolMemoryAllocator::fillPool
static void * fillPool(MemElemPtr &pFreeBytes, uint16_t nBytes)
OGDF_EXPORT
#define OGDF_EXPORT
Specifies that a function or class is exported by the OGDF DLL.
Definition: config.h:101
ogdf::PoolMemoryAllocator::s_tp
static thread_local MemElemPtr s_tp[TABLE_SIZE]
Contains the allocated but free memory for a single thread.
Definition: PoolMemoryAllocator.h:165
ogdf::PoolMemoryAllocator::MemElem::m_next
MemElem * m_next
Definition: PoolMemoryAllocator.h:58
ogdf::PoolMemoryAllocator::MemElemPtr
MemElem * MemElemPtr
Definition: PoolMemoryAllocator.h:61
ogdf::PoolMemoryAllocator::s_blocks
static BlockChain * s_blocks
Holds all allocated memory independently of whether it is cleared in chunks of size BLOCK_SIZE.
Definition: PoolMemoryAllocator.h:151
ogdf::PoolMemoryAllocator::s_pool
static PoolElement s_pool[TABLE_SIZE]
Contains allocated but free memory that may be used by all threads. Filled upon exiting a thread that...
Definition: PoolMemoryAllocator.h:148
ogdf::PoolMemoryAllocator::checkSize
static bool checkSize(size_t nBytes)
Returns true iff allocate can be invoked with nBytes.
ogdf::PoolMemoryAllocator::MIN_BYTES
static constexpr size_t MIN_BYTES
Definition: PoolMemoryAllocator.h:66