mempool.h revision 80d3b05559a9024b8352d52419a1b1c0aeca654e
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch#ifndef __MEMPOOL_H
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen#define __MEMPOOL_H
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen#include "macros.h"
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen/* #define POOL_CHECK_LEAKS */
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen/* Memory allocated and reallocated (the new data in it) in pools is always
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen zeroed, it will cost only a few CPU cycles and may well save some debug
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen time. */
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainentypedef struct Pool *Pool;
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainenstruct Pool {
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen void (*ref)(Pool pool);
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen void (*unref)(Pool pool);
d198989a7cac917ba0bd341a76d94e8a32267074Timo Sirainen
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen void *(*malloc)(Pool pool, size_t size);
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen void (*free)(Pool pool, void *mem);
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen /* reallocate the `mem' to be exactly `size' */
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen void *(*realloc)(Pool pool, void *mem, size_t size);
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen /* Frees all the memory in pool. NOTE: system_pool doesn't support
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen this and crashes if it's used */
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen void (*clear)(Pool pool);
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen};
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen/* system_pool uses calloc() + realloc() + free() */
af8b1248fed8529d26985460acdc4b1e4b7de675Timo Sirainenextern Pool system_pool;
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen/* memory allocated from data_stack is valid only until next t_pop() call. */
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainenextern Pool data_stack_pool;
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen/* Create a new alloc-only pool. Note that `size' specifies the initial
66bcc2a2f65576211f2f55edbe61130b96287fcdTimo Sirainen malloc()ed block size, part of it is used internally. */
Pool pool_alloconly_create(const char *name, size_t size);
/* Pools should be used through these macros: */
#define pool_ref(pool) (pool)->ref(pool)
#define pool_unref(pool) (pool)->unref(pool)
#define p_malloc(pool, size) (pool)->malloc(pool, size)
#define p_realloc(pool, mem, size) (pool)->realloc(pool, mem, size)
#define p_free(pool, mem) (pool)->free(pool, mem)
#define p_clear(pool) (pool)->clear(pool)
/* Extra macros to make life easier: */
#define p_new(pool, type, count) \
((type *) p_malloc(pool, sizeof(type) * (count)))
#define p_free_and_null(pool, rec) \
STMT_START { \
p_free(pool, rec); \
(rec) = NULL; \
} STMT_END
/* p_free_clean() should be used when pool is being destroyed, so freeing
memory isn't needed for anything else than detecting memory leaks. */
#ifdef POOL_CHECK_LEAKS
# define p_free_clean(pool, mem) p_free(pool, mem)
#else
# define p_free_clean(pool, mem)
#endif
#endif