--- libaitsess/src/Attic/mem.c 2012/02/28 00:13:26 1.1.2.4 +++ libaitsess/src/Attic/mem.c 2012/02/28 09:28:00 1.1.2.6 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: mem.c,v 1.1.2.4 2012/02/28 00:13:26 misho Exp $ +* $Id: mem.c,v 1.1.2.6 2012/02/28 09:28:00 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -49,10 +49,11 @@ SUCH DAMAGE. /* * mpool_init() - Init memory pool * + * @maxmem = If !=0 set maximum memory quota * return: =NULL error or !=NULL new allocated pool */ mpool_t * -mpool_init(void) +mpool_init(u_long maxmem) { mpool_t *mp; register int i; @@ -66,6 +67,8 @@ mpool_init(void) pthread_mutex_init(&mp->pool_mtx, NULL); + mp->pool_quota.max = maxmem; + mpool_lock(mp); for (i = 0; i < MEM_BUCKETS; i++) { TAILQ_INIT(&mp->pool_active[i]); @@ -298,7 +301,7 @@ mpool_free(mpool_t * __restrict mp, void * __restrict sess_SetErr(EFAULT, "Corrupted memory address"); return -2; } else - idx = BucketIndex(((u_int*)data)[-2]); + idx = BucketIndex(((u_int*)data)[-2] * sizeof(u_int)); mpool_lock(mp); TAILQ_FOREACH(m, &mp->pool_active[idx], alloc_node) @@ -440,4 +443,59 @@ mpool_chkaddr(void * __restrict data) return 1; /* data address is ok! */ return 0; +} + +/* + * mpool_setquota() - Change maximum memory quota + * + * @mp = Memory pool + * @maxmem = New max quota size + * return: old maximum memory quota size + */ +inline u_long +mpool_setquota(mpool_t * __restrict mp, u_long maxmem) +{ + u_long ret; + + if (!mp) + return 0; + + ret = mp->pool_quota.max; + mp->pool_quota.max = maxmem; + + /* if new max quota is less then current allocated memory, + * try to purge memory cache blocks + */ + if (mp->pool_quota.max < mp->pool_quota.curr) + mpool_purge(mp, 0); + + return ret; +} + +/* ----------------------------------------------------------- */ + +/* + * 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) +{ + struct tagAlloc *m; + register int i, act, inact; + + if (!mp || !cb) + return; + + for (i = act = inact = 0; i < MEM_BUCKETS; act = inact = 0, i++) { + TAILQ_FOREACH(m, &mp->pool_active[i], alloc_node) + act++; + TAILQ_FOREACH(m, &mp->pool_inactive[i], alloc_node) + inact++; + + cb(1 << (i + MEM_MIN_BUCKET), act, inact); + } }