Annotation of libaitio/inc/ampool.h, revision 1.3

1.2       misho       1: /*************************************************************************
                      2: * (C) 2012 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org>
                      3: *  by Michael Pounov <misho@elwix.org>
                      4: *
                      5: * $Author: misho $
1.3     ! misho       6: * $Id: ampool.h,v 1.2.2.1 2012/07/22 12:32:34 misho Exp $
1.2       misho       7: *
                      8: **************************************************************************
                      9: The ELWIX and AITNET software is distributed under the following
                     10: terms:
                     11: 
                     12: All of the documentation and software included in the ELWIX and AITNET
                     13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
                     14: 
1.3     ! misho      15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
1.2       misho      16:        by Michael Pounov <misho@elwix.org>.  All rights reserved.
                     17: 
                     18: Redistribution and use in source and binary forms, with or without
                     19: modification, are permitted provided that the following conditions
                     20: are met:
                     21: 1. Redistributions of source code must retain the above copyright
                     22:    notice, this list of conditions and the following disclaimer.
                     23: 2. Redistributions in binary form must reproduce the above copyright
                     24:    notice, this list of conditions and the following disclaimer in the
                     25:    documentation and/or other materials provided with the distribution.
                     26: 3. All advertising materials mentioning features or use of this software
                     27:    must display the following acknowledgement:
                     28: This product includes software developed by Michael Pounov <misho@elwix.org>
                     29: ELWIX - Embedded LightWeight unIX and its contributors.
                     30: 4. Neither the name of AITNET nor the names of its contributors
                     31:    may be used to endorse or promote products derived from this software
                     32:    without specific prior written permission.
                     33: 
                     34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
                     35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     37: ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     44: SUCH DAMAGE.
                     45: */
                     46: #ifndef __AMPOOL_H
                     47: #define __AMPOOL_H
                     48: 
                     49: 
1.3     ! misho      50: #include <pthread.h>
        !            51: 
        !            52: 
1.2       misho      53: /* Memory pool */
                     54: 
                     55: #define MEM_BUCKETS    28      /* 32 bits - 4 bits = 28 items in bucket array */
                     56: 
                     57: struct tagAlloc {
                     58:        char                    alloc_name[64];
                     59: 
                     60:        unsigned int            *alloc_mem;
                     61: 
                     62:        TAILQ_ENTRY(tagAlloc)   alloc_node;
                     63: };
                     64: typedef TAILQ_HEAD(, tagAlloc) mpool_bucket_t;
                     65: 
                     66: typedef struct _tagMPool {
                     67:        pthread_mutex_t pool_mtx;
                     68: 
                     69:        struct {
                     70:                unsigned long alloc;
                     71:                unsigned long free;
                     72:                unsigned long cache;
                     73:        } pool_calls;
                     74:        struct {
                     75:                unsigned long alloc;
                     76:                unsigned long free;
                     77:                unsigned long cache;
                     78:        } pool_bytes;
                     79:        struct {
                     80:                unsigned long max;
                     81:                unsigned long curr;
                     82:        } pool_quota;
                     83: 
                     84:        /* pool buckets */
                     85:        mpool_bucket_t  pool_active[MEM_BUCKETS];
                     86:        mpool_bucket_t  pool_inactive[MEM_BUCKETS];
                     87: } mpool_t;
                     88: #define mpool_lock(x)  (assert((x)), pthread_mutex_lock(&(x)->pool_mtx))
                     89: #define mpool_unlock(x)        (assert((x)), pthread_mutex_unlock(&(x)->pool_mtx))
                     90: 
                     91: typedef void (*mpool_stat_cb)(unsigned int, unsigned int, unsigned int);
                     92: 
                     93: /* mpool functions */
                     94: 
                     95: /*
                     96:  * mpool_init() - Init memory pool
                     97:  *
                     98:  * @maxmem = If !=0 set maximum memory quota
                     99:  * return: =NULL error or !=NULL new allocated pool
                    100:  */
                    101: mpool_t *mpool_init(unsigned long maxmem);
                    102: /*
                    103:  * mpool_destroy() - Destroy memory pool
                    104:  *
                    105:  * @mp = Memory pool
                    106:  * return: none
                    107:  */
                    108: void mpool_destroy(mpool_t ** __restrict mp);
                    109: /*
                    110:  * mpool_purge() - Purge memory block cache and release resources
                    111:  *
                    112:  * @mp = Memory pool
                    113:  * @atmost = Free at most in buckets
                    114:  * return: -1 error or 0 ok
                    115:  */
                    116: int mpool_purge(mpool_t * __restrict mp, unsigned int atmost);
                    117: /*
                    118:  * mpool_malloc() - Memory allocation
                    119:  *
                    120:  * @mp = Memory pool
                    121:  * @size = Size
                    122:  * @memname = Optional memory block name
                    123:  * return: NULL error or !=NULL ok allocated memory
                    124:  */
                    125: void *mpool_malloc(mpool_t * __restrict mp, unsigned int size, const char *memname);
                    126: /*
                    127:  * mpool_free() Free allocated memory with mpool_alloc()
                    128:  *
                    129:  * @mp = Memory pool
                    130:  * @data = Allocated memory data
                    131:  * @purge = if !=0 force release memory block
                    132:  * return: <0 error or 0 ok released memory block
                    133:  */
                    134: int mpool_free(mpool_t * __restrict mp, void * __restrict data, int purge);
                    135: /*
                    136:  * mpool_free2() Free allocated memory with mpool_alloc() by size and memory name
                    137:  *
                    138:  * @mp = Memory pool
                    139:  * @size = Allocated memory data size
                    140:  * @memname = Memory name
                    141:  * @purge = if !=0 force release memory block
                    142:  * return: <0 error or 0 ok released memory block
                    143:  */
                    144: int mpool_free2(mpool_t * __restrict mp, unsigned int size, const char *memname, int purge);
                    145: /*
                    146:  * mpool_realloc() Reallocate memory block with new size
                    147:  *
                    148:  * @mp = Memory pool
                    149:  * @data = Allocated memory data
                    150:  * @newsize = New size of memory block
                    151:  * @memname = Optional new memory block name
                    152:  * return: NULL error or !=NULL new reallocated memory block
                    153:  */
                    154: void *mpool_realloc(mpool_t * __restrict mp, void * __restrict data, 
                    155:                unsigned int newsize, const char *memname);
                    156: /*
                    157:  * mpool_strdup() - String duplicate
                    158:  *
                    159:  * @mp = Memory pool
                    160:  * @str = String
                    161:  * @memname = Memory name
                    162:  * return: NULL error or !=NULL new string
                    163:  */
                    164: char *mpool_strdup(mpool_t * __restrict mp, const char *str, const char *memname);
                    165: /*
                    166:  * mpool_getmembynam() Find allocated memory block by size and memory name
                    167:  *
                    168:  * @mp = Memory pool
                    169:  * @size = Memory size
                    170:  * @memname = Memory name
                    171:  * return: NULL error or not found and !=NULL allocated memory 
                    172:  */
                    173: inline struct tagAlloc *mpool_getmembynam(mpool_t * __restrict mp, unsigned int size, const char *memname);
                    174: /*
                    175:  * mpool_getsizebyaddr() - Get size of allocated memory block by address
                    176:  *
                    177:  * @data = allocated memory from mpool_malloc()
                    178:  * return: usable size of allocated memory block
                    179:  */
                    180: inline unsigned int mpool_getsizebyaddr(void * __restrict data);
                    181: /*
                    182:  * mpool_chkaddr() - Check validity of given address
                    183:  *
                    184:  * @data = allocated memory from mpool_malloc()
                    185:  * return: -1 bad address, 1 corrupted address or 0 ok
                    186:  */
                    187: inline int mpool_chkaddr(void * __restrict data);
                    188: /*
                    189:  * mpool_setquota() - Change maximum memory quota
                    190:  *
                    191:  * @mp = Memory pool
                    192:  * @maxmem = New max quota size
                    193:  * return: old maximum memory quota size
                    194:  */
                    195: inline unsigned long mpool_setquota(mpool_t * __restrict mp, unsigned long maxmem);
                    196: /*
                    197:  * mpool_getquota() - Get memory quota
                    198:  *
                    199:  * @mp = Memory pool
                    200:  * @currmem = Return current memory
                    201:  * @maxmem = Return max quota size
                    202:  * return: none
                    203:  */
                    204: inline void mpool_getquota(mpool_t * __restrict mp, unsigned long *currmem, 
                    205:                unsigned long *maxmem);
                    206: /*
                    207:  * mpool_statistics() - Dump statistics from memory pool buckets
                    208:  *
                    209:  * @mp = Memory pool
                    210:  * @cb = Export statistics to callback
                    211:  * return: none
                    212:  */
                    213: void mpool_statistics(mpool_t * __restrict mp, mpool_stat_cb cb);
                    214: 
                    215: 
                    216: /* Wrappers */
                    217: 
                    218: /*
                    219:  * mpool_xmalloc() - malloc wrapper
                    220:  *
                    221:  * @size = Size
                    222:  * return: NULL error or !=NULL ok allocated memory
                    223:  */
                    224: void *mpool_xmalloc(size_t size);
                    225: /*
                    226:  * mpool_xcalloc() - calloc wrapper
                    227:  *
                    228:  * @num = number of elements
                    229:  * @size = Size of element
                    230:  * return: NULL error or !=NULL ok allocated memory
                    231:  */
                    232: void *mpool_xcalloc(size_t num, size_t size);
                    233: /*
                    234:  * mpool_xrealloc() - realloc wrapper
                    235:  *
                    236:  * @data = Allocated memory data
                    237:  * @newsize = New size of memory block
                    238:  * return: NULL error or !=NULL new reallocated memory block
                    239:  */
                    240: void *mpool_xrealloc(void * __restrict data, size_t newsize);
                    241: /*
                    242:  * mpool_xfree() - free wrapper
                    243:  *
                    244:  * @data = Allocated memory data
                    245:  * return: none
                    246:  */
                    247: void mpool_xfree(void * __restrict data);
                    248: /*
                    249:  * mpool_xstrdup() - strdup wrapper
                    250:  *
                    251:  * @str = string
                    252:  * return: =NULL error or !=NULL new allocated string
                    253:  */
                    254: char *mpool_xstrdup(const char *str);
                    255: 
                    256: 
                    257: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>