diff options
Diffstat (limited to 'src/oldpool.h')
-rw-r--r-- | src/oldpool.h | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/oldpool.h b/src/oldpool.h index 3813e8f1c..80e121cb6 100644 --- a/src/oldpool.h +++ b/src/oldpool.h @@ -92,6 +92,40 @@ static inline bool AddBlockToPool(OldMemoryPoolBase *array) { return array->AddB static inline bool AddBlockIfNeeded(OldMemoryPoolBase *array, uint index) { return array->AddBlockIfNeeded(index); } +/** + * Generic function to initialize a new block in a pool. + * @param start_item the first item that needs to be initialized + */ +template <typename T, OldMemoryPool<T> *Tpool> +static void PoolNewBlock(uint start_item) +{ + /* We don't use FOR_ALL here, because FOR_ALL skips invalid items. + * TODO - This is just a temporary stage, this will be removed. */ + for (T *t = Tpool->Get(start_item); t != NULL; t = (t->index + 1U < Tpool->GetSize()) ? Tpool->Get(t->index + 1U) : NULL) { + t->index = start_item++; + t->PreInit(); + } +} + +/** + * Generic function to free a new block in a pool. + * This function uses QuickFree that is intended to only free memory that would be lost if the pool is freed. + * @param start_item the first item that needs to be cleaned + * @param end_item the last item that needs to be cleaned + */ +template <typename T, OldMemoryPool<T> *Tpool> +static void PoolCleanBlock(uint start_item, uint end_item) +{ + for (uint i = start_item; i <= end_item; i++) { + T *t = Tpool->Get(i); + if (t->IsValid()) { + t->QuickFree(); + } + } +} + + + #define OLD_POOL_ENUM(name, type, block_size_bits, max_blocks) \ enum { \ name##_POOL_BLOCK_SIZE_BITS = block_size_bits, \ @@ -115,6 +149,11 @@ static inline bool AddBlockIfNeeded(OldMemoryPoolBase *array, uint index) { retu #name, name##_POOL_MAX_BLOCKS, name##_POOL_BLOCK_SIZE_BITS, sizeof(type), \ new_block_proc, clean_block_proc); +#define DEFINE_OLD_POOL_GENERIC(name, type) \ + OldMemoryPool<type> _##name##_pool( \ + #name, name##_POOL_MAX_BLOCKS, name##_POOL_BLOCK_SIZE_BITS, sizeof(type), \ + PoolNewBlock<type, &_##name##_pool>, PoolCleanBlock<type, &_##name##_pool>); + #define STATIC_OLD_POOL(name, type, block_size_bits, max_blocks, new_block_proc, clean_block_proc) \ OLD_POOL_ENUM(name, type, block_size_bits, max_blocks) \ |