--- libaitio/src/aitio.c 2012/05/23 12:16:13 1.10.6.3 +++ libaitio/src/aitio.c 2012/05/23 13:53:00 1.10.6.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.c,v 1.10.6.3 2012/05/23 12:16:13 misho Exp $ +* $Id: aitio.c,v 1.10.6.4 2012/05/23 13:53:00 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -47,11 +47,21 @@ SUCH DAMAGE. int io_Debug; +mpool_t *io_mpool; +/* Memory management */ + +void *(*io_malloc)(size_t) = malloc; +void *(*io_calloc)(size_t, size_t) = calloc; +void *(*io_realloc)(void*, size_t) = realloc; +char *(*io_strdup)(const char*) = strdup; +void (*io_free)(void*) = free; + + #pragma GCC visibility push(hidden) -int io_mpool; +int use_mm; int io_Errno; char io_Error[STRSIZ]; @@ -86,11 +96,11 @@ io_SetErr(int eno, char *estr, ...) va_end(lst); } -// mpool_inuse() Check for mpool usage +// io_mm_inuse() Check for memory management model inline int -mpool_inuse() +io_mm_inuse() { - return io_mpool; + return use_mm & IO_MPOOL; } @@ -99,9 +109,9 @@ void _init() { #ifdef USE_MPOOL - io_mpool = 42; + ioLibInit(IO_MPOOL, 0); #else - io_mpool = 0; + ioLibInit(IO_SYSM, 0); #endif } @@ -109,6 +119,69 @@ _init() void _fini() { + ioLibFini(); +} + +/* + * ioLibInit() - Init libaitio library memory management + * + * @mm = memory management (IO_SYSM or IO_MPOOL) + * @maxmem = memory limit + * return: -1 error or !=-1 used memory management model + */ +inline int +ioLibInit(int mm, u_long maxmem) +{ + switch (mm) { + case IO_MPOOL: /* mpool */ + io_mpool = mpool_init(maxmem); + if (io_mpool) { + io_malloc = mpool_xmalloc; + io_calloc = mpool_xcalloc; + io_realloc = mpool_xrealloc; + io_strdup = mpool_xstrdup; + io_free = mpool_xfree; + use_mm = mm; + break; + } else { + #undef USE_MPOOL + } + case IO_SYSM: /* system */ + io_malloc = malloc; + io_calloc = calloc; + io_realloc = realloc; + io_strdup = strdup; + io_free = free; + use_mm = mm; + break; + default: /* not supported */ + io_SetErr(EINVAL, "Not supported memory management"); + return -1; + } + + return use_mm; +} + +/* + * ioLibFini() - Finish libaitio library memory management + * + * return: none + */ +inline void +ioLibFini() +{ + switch (use_mm) { + case 1: + mpool_destroy(&io_mpool); + + io_malloc = malloc; + io_calloc = calloc; + io_realloc = realloc; + io_strdup = strdup; + io_free = free; + use_mm = IO_SYSM; + break; + } }