File:  [ELWIX - Embedded LightWeight unIX -] / libaitio / inc / Attic / ampool.h
Revision 1.1.2.3: download - view: text, annotated - select for diffs - revision graph
Wed May 23 13:53:00 2012 UTC (12 years, 5 months ago) by misho
Branches: io3_1
added new wrappers

#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>