mempool.h revision ad0ef8f436c41037e9f1d70286f7054e400fad92
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen#ifndef __MEMPOOL_H
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#define __MEMPOOL_H
5254d77805cd35b9356d072ba325c356c43b0d51Timo Sirainen
5254d77805cd35b9356d072ba325c356c43b0d51Timo Sirainen#include "macros.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen/* #define POOL_CHECK_LEAKS */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen/* Memory allocated and reallocated (the new data in it) in pools is always
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen zeroed, it will cost only a few CPU cycles and may well save some debug
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen time. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainentypedef struct pool *pool_t;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenstruct pool {
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen const char *(*get_name)(pool_t pool);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen void (*ref)(pool_t pool);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen void (*unref)(pool_t pool);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen void *(*malloc)(pool_t pool, size_t size);
8edc373587d75f8040e3c4416e50638aa2a32188Timo Sirainen void (*free)(pool_t pool, void *mem);
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* memory in old_size..new_size will be zeroed */
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen void *(*realloc)(pool_t pool, void *mem,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen size_t old_size, size_t new_size);
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen /* Frees all the memory in pool. NOTE: system_pool doesn't support
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen this and crashes if it's used */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen void (*clear)(pool_t pool);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen unsigned int alloconly_pool:1;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
2c25e1360d4b5cc55eda969a3a7204d950de5a8fTimo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen/* system_pool uses calloc() + realloc() + free() */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenextern pool_t system_pool;
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen/* memory allocated from data_stack is valid only until next t_pop() call. */
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainenextern pool_t data_stack_pool;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
fe363b433b8038a69b55169da9dca27892ad7d18Timo Sirainen/* Create a new alloc-only pool. Note that `size' specifies the initial
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen malloc()ed block size, part of it is used internally. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenpool_t pool_alloconly_create(const char *name, size_t size);
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen/* Pools should be used through these macros: */
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen#define pool_get_name(pool) (pool)->get_name(pool)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#define pool_ref(pool) (pool)->ref(pool)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#define pool_unref(pool) (pool)->unref(pool)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#define p_malloc(pool, size) (pool)->malloc(pool, size)
14175321ddb88619015866978c05a27786ca4814Timo Sirainen#define p_realloc(pool, mem, old_size, new_size) \
14175321ddb88619015866978c05a27786ca4814Timo Sirainen (pool)->realloc(pool, mem, old_size, new_size)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen#define p_free(pool, mem) (pool)->free(pool, mem)
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen#define p_clear(pool) (pool)->clear(pool)
1060afdc2fcdf647dbb3bc11647401f1b44a3a8aTimo Sirainen
1060afdc2fcdf647dbb3bc11647401f1b44a3a8aTimo Sirainen/* Extra macros to make life easier: */
1060afdc2fcdf647dbb3bc11647401f1b44a3a8aTimo Sirainen#define p_new(pool, type, count) \
8edc373587d75f8040e3c4416e50638aa2a32188Timo Sirainen ((type *) p_malloc(pool, sizeof(type) * (count)))
8edc373587d75f8040e3c4416e50638aa2a32188Timo Sirainen#define p_free_and_null(pool, rec) \
8edc373587d75f8040e3c4416e50638aa2a32188Timo Sirainen STMT_START { \
8edc373587d75f8040e3c4416e50638aa2a32188Timo Sirainen p_free(pool, rec); \
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen (rec) = NULL; \
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen } STMT_END
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen/* p_free_clean() should be used when pool is being destroyed, so freeing
c9bf63e9094761767a63ac6b189bcf60bcffdc44Timo Sirainen memory isn't needed for anything else than detecting memory leaks. */
c9bf63e9094761767a63ac6b189bcf60bcffdc44Timo Sirainen#ifdef POOL_CHECK_LEAKS
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen# define p_free_clean(pool, mem) p_free(pool, mem)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen#else
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen# define p_free_clean(pool, mem)
9e095dd6a77097356aca8216356d4d71ef1bea45Timo Sirainen#endif
8edc373587d75f8040e3c4416e50638aa2a32188Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen#endif
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen