21 #include <spot/misc/common.hh>
22 #include <unordered_map>
24 #if SPOT_DEBUG && __has_include(<valgrind/memcheck.h>)
25 #undef USES_MEMCHECK_H
26 #define USES_MEMCHECK_H 1
27 #include <valgrind/memcheck.h>
36 static const size_t alignment_ = 2 *
sizeof(size_t) - 1;
40 : free_start_(nullptr), free_end_(nullptr), chunklist_(nullptr)
49 chunk_* prev = chunklist_->prev;
58 if (size <
sizeof(block_))
59 size =
sizeof(block_);
61 return (size + alignment_ - 1) & ~(alignment_ - 1);
70 block_*& f = freelist_[size];
75 #ifdef USES_MEMCHECK_H
76 VALGRIND_MALLOCLIKE_BLOCK(f, size, 0,
false);
79 VALGRIND_MAKE_MEM_DEFINED(f,
sizeof(block_*));
89 if (free_start_ + size > free_end_)
91 const size_t requested = (size > 128 ? size : 128) * 8192 - 64;
92 chunk_* c =
reinterpret_cast<chunk_*
>(malloc(requested));
94 throw std::bad_alloc();
98 free_start_ = c->data_ + size;
99 free_end_ = c->data_ + requested;
102 void* res = free_start_;
104 #ifdef USES_MEMCHECK_H
105 VALGRIND_MALLOCLIKE_BLOCK(res, size, 0,
false);
125 block_* b =
reinterpret_cast<block_*
>(
const_cast<void*
>(ptr));
126 block_*& f = freelist_[size];
129 #ifdef USES_MEMCHECK_H
130 VALGRIND_FREELIKE_BLOCK(ptr, 0);
135 struct block_ { block_* next; };
136 std::unordered_map<size_t, block_*> freelist_;
140 union chunk_ { chunk_* prev;
char data_[1]; }* chunklist_;
A multiple-size memory pool implementation.
Definition: mspool.hh:35
void * allocate(size_t size)
Allocate size bytes of memory.
Definition: mspool.hh:66
~multiple_size_pool()
Free any memory allocated by this pool.
Definition: mspool.hh:45
size_t fixsize(size_t size) const
Round size up to alignment and enforce minimum block size.
Definition: mspool.hh:56
multiple_size_pool()
Create a pool.
Definition: mspool.hh:39
Definition: automata.hh:26