--- libaitio/inc/Attic/ampool.h 2012/05/23 10:54:45 1.1 +++ libaitio/inc/Attic/ampool.h 2012/07/03 08:51:05 1.2 @@ -0,0 +1,254 @@ +/************************************************************************* +* (C) 2012 AITNET ltd - Sofia/Bulgaria - +* by Michael Pounov +* +* $Author: misho $ +* $Id: ampool.h,v 1.2 2012/07/03 08:51:05 misho Exp $ +* +************************************************************************** +The ELWIX and AITNET software is distributed under the following +terms: + +All of the documentation and software included in the ELWIX and AITNET +Releases is copyrighted by ELWIX - Sofia/Bulgaria + +Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 + by Michael Pounov . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: +This product includes software developed by Michael Pounov +ELWIX - Embedded LightWeight unIX and its contributors. +4. Neither the name of AITNET nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ +#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