#ifndef __AMPOOL_H
#define __AMPOOL_H
/* Memory pool */
#define MEM_BUCKETS 28 /* 32 bits - 4 bits = 28 items in bucket array */
struct tagAlloc {
char alloc_name[64];
unsigned int *alloc_mem;
TAILQ_ENTRY(tagAlloc) alloc_node;
};
typedef TAILQ_HEAD(, tagAlloc) mpool_bucket_t;
typedef struct _tagMPool {
pthread_mutex_t pool_mtx;
struct {
unsigned long alloc;
unsigned long free;
unsigned long cache;
} pool_calls;
struct {
unsigned long alloc;
unsigned long free;
unsigned long cache;
} pool_bytes;
struct {
unsigned long max;
unsigned long curr;
} pool_quota;
/* pool buckets */
mpool_bucket_t pool_active[MEM_BUCKETS];
mpool_bucket_t pool_inactive[MEM_BUCKETS];
} mpool_t;
#define mpool_lock(x) (assert((x)), pthread_mutex_lock(&(x)->pool_mtx))
#define mpool_unlock(x) (assert((x)), pthread_mutex_unlock(&(x)->pool_mtx))
typedef void (*mpool_stat_cb)(unsigned int, unsigned int, unsigned int);
/* mpool functions */
/*
* mpool_init() - Init memory pool
*
* @maxmem = If !=0 set maximum memory quota
* return: =NULL error or !=NULL new allocated pool
*/
mpool_t *mpool_init(unsigned long maxmem);
/*
* mpool_destroy() - Destroy memory pool
*
* @mp = Memory pool
* return: none
*/
void mpool_destroy(mpool_t ** __restrict mp);
/*
* mpool_purge() - Purge memory block cache and release resources
*
* @mp = Memory pool
* @atmost = Free at most in buckets
* return: -1 error or 0 ok
*/
int mpool_purge(mpool_t * __restrict mp, unsigned int atmost);
/*
* mpool_malloc() - Memory allocation
*
* @mp = Memory pool
* @size = Size
* @memname = Optional memory block name
* return: NULL error or !=NULL ok allocated memory
*/
void *mpool_malloc(mpool_t * __restrict mp, unsigned int size, const char *memname);
/*
* mpool_free() Free allocated memory with mpool_alloc()
*
* @mp = Memory pool
* @data = Allocated memory data
* @purge = if !=0 force release memory block
* return: <0 error or 0 ok released memory block
*/
int mpool_free(mpool_t * __restrict mp, void * __restrict data, int purge);
/*
* mpool_free2() Free allocated memory with mpool_alloc() by size and memory name
*
* @mp = Memory pool
* @size = Allocated memory data size
* @memname = Memory name
* @purge = if !=0 force release memory block
* return: <0 error or 0 ok released memory block
*/
int mpool_free2(mpool_t * __restrict mp, unsigned int size, const char *memname, int purge);
/*
* mpool_realloc() Reallocate memory block with new size
*
* @mp = Memory pool
* @data = Allocated memory data
* @newsize = New size of memory block
* @memname = Optional new memory block name
* return: NULL error or !=NULL new reallocated memory block
*/
void *mpool_realloc(mpool_t * __restrict mp, void * __restrict data,
unsigned int newsize, const char *memname);
/*
* mpool_strdup() - String duplicate
*
* @mp = Memory pool
* @str = String
* @memname = Memory name
* return: NULL error or !=NULL new string
*/
char *mpool_strdup(mpool_t * __restrict mp, const char *str, const char *memname);
/*
* mpool_getmembynam() Find allocated memory block by size and memory name
*
* @mp = Memory pool
* @size = Memory size
* @memname = Memory name
* return: NULL error or not found and !=NULL allocated memory
*/
inline struct tagAlloc *mpool_getmembynam(mpool_t * __restrict mp, unsigned int size, const char *memname);
/*
* mpool_getsizebyaddr() - Get size of allocated memory block by address
*
* @data = allocated memory from mpool_malloc()
* return: usable size of allocated memory block
*/
inline unsigned int mpool_getsizebyaddr(void * __restrict data);
/*
* mpool_chkaddr() - Check validity of given address
*
* @data = allocated memory from mpool_malloc()
* return: -1 bad address, 1 corrupted address or 0 ok
*/
inline int mpool_chkaddr(void * __restrict data);
/*
* mpool_setquota() - Change maximum memory quota
*
* @mp = Memory pool
* @maxmem = New max quota size
* return: old maximum memory quota size
*/
inline unsigned long mpool_setquota(mpool_t * __restrict mp, unsigned long maxmem);
/*
* mpool_getquota() - Get memory quota
*
* @mp = Memory pool
* @currmem = Return current memory
* @maxmem = Return max quota size
* return: none
*/
inline void mpool_getquota(mpool_t * __restrict mp, unsigned long *currmem,
unsigned long *maxmem);
/*
* mpool_statistics() - Dump statistics from memory pool buckets
*
* @mp = Memory pool
* @cb = Export statistics to callback
* return: none
*/
void mpool_statistics(mpool_t * __restrict mp, mpool_stat_cb cb);
/* Wrappers */
/*
* mpool_xmalloc() - malloc wrapper
*
* @size = Size
* return: NULL error or !=NULL ok allocated memory
*/
void *mpool_xmalloc(size_t size);
/*
* mpool_xcalloc() - calloc wrapper
*
* @num = number of elements
* @size = Size of element
* return: NULL error or !=NULL ok allocated memory
*/
void *mpool_xcalloc(size_t num, size_t size);
/*
* mpool_xrealloc() - realloc wrapper
*
* @data = Allocated memory data
* @newsize = New size of memory block
* return: NULL error or !=NULL new reallocated memory block
*/
void *mpool_xrealloc(void * __restrict data, size_t newsize);
/*
* mpool_xfree() - free wrapper
*
* @data = Allocated memory data
* return: none
*/
void mpool_xfree(void * __restrict data);
/*
* mpool_xstrdup() - strdup wrapper
*
* @str = string
* return: =NULL error or !=NULL new allocated string
*/
char *mpool_xstrdup(const char *str);
#endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>