mempool.h revision dd0fd94add215d793a6869215c0509308b94c877
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen#ifndef __MEMPOOL_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define __MEMPOOL_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "macros.h"
8363f50d7b5d605912e55c34f7f28e9f4ce01341Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Memory allocated and reallocated (the new data in it) in pools is always
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen zeroed, it will cost only a few CPU cycles and may well save some debug
e8bdf1be00aec45d0c6dd72ad9c8be02a3dfc778Timo Sirainen time. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainentypedef struct pool *pool_t;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
de4e3a2e1e8f82b2d3226c090b71b518b43bf9cfTimo Sirainenstruct pool {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *(*get_name)(pool_t pool);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void (*ref)(pool_t pool);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void (*unref)(pool_t pool);
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen void *(*malloc)(pool_t pool, size_t size);
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen void (*free)(pool_t pool, void *mem);
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen /* memory in old_size..new_size will be zeroed */
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen void *(*realloc)(pool_t pool, void *mem,
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen size_t old_size, size_t new_size);
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Frees all the memory in pool. NOTE: system_pool doesn't support
8363f50d7b5d605912e55c34f7f28e9f4ce01341Timo Sirainen this and crashes if it's used */
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen void (*clear)(pool_t pool);
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Returns the maximum amount of bytes that can be allocated with
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen minimal trouble. If there's no such concept, always returns 0. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen size_t (*get_max_easy_alloc_size)(pool_t pool);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int alloconly_pool:1;
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen unsigned int datastack_pool:1;
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen};
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen/* system_pool uses calloc() + realloc() + free() */
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainenextern pool_t system_pool;
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen/* memory allocated from data_stack is valid only until next t_pop() call.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen No checks are performed. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenextern pool_t unsafe_data_stack_pool;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen/* Create a new alloc-only pool. Note that `size' specifies the initial
2cfe9983ce7a6280636ee12beccc2e865111967bTimo Sirainen malloc()ed block size, part of it is used internally. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenpool_t pool_alloconly_create(const char *name, size_t size);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* When allocating memory from returned pool, the data stack frame must be
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen the same as it was when calling this function. pool_unref() also checks
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen that the stack frame is the same. This should make it quite safe to use. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenpool_t pool_datastack_create(void);
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen/* Pools should be used through these macros: */
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen#define pool_get_name(pool) (pool)->get_name(pool)
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen#define pool_ref(pool) (pool)->ref(pool)
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen#define pool_unref(pool) (pool)->unref(pool)
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen#define p_new(pool, type, count) \
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ((type *) p_malloc(pool, sizeof(type) * (count)))
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define p_malloc(pool, size) (pool)->malloc(pool, size)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define p_realloc(pool, mem, old_size, new_size) \
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen (pool)->realloc(pool, mem, old_size, new_size)
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen#define p_free(pool, mem) \
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen STMT_START { \
d42eb03b3a4e79a2da22a1be2de59b95660af2beTimo Sirainen (pool)->free(pool, mem); \
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen (mem) = NULL; \
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen } STMT_END
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen#define p_clear(pool) (pool)->clear(pool)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen#define p_get_max_easy_alloc_size(pool) (pool)->get_max_easy_alloc_size(pool)
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen#endif
2d01cc1880cf2afd4fb1c8ad7fa6ce78e562e71eTimo Sirainen