X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fnmem.c;h=920d4e5fb880197fe50f5f1413ef866a22076285;hp=e2b2aa9afbf215e6a0c0591bda23dd3e2dcbbd3b;hb=69cc5b167c5afbc8d14c0db30f9a5fb34dda0a24;hpb=1bbc43ce88a03e20f3ddf503ba27ef6703d91d9a diff --git a/src/nmem.c b/src/nmem.c index e2b2aa9..920d4e5 100644 --- a/src/nmem.c +++ b/src/nmem.c @@ -1,8 +1,8 @@ /* - * Copyright (C) 1995-2005, Index Data ApS + * Copyright (C) 1995-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: nmem.c,v 1.21 2006-02-01 20:29:19 adam Exp $ + * $Id: nmem.c,v 1.27 2006-12-13 15:29:01 adam Exp $ */ /** @@ -54,7 +54,7 @@ struct nmem_block struct nmem_control { int total; - nmem_block *blocks; + struct nmem_block *blocks; struct nmem_control *next; }; @@ -107,6 +107,9 @@ struct nmem_mutex { }; #endif +size_t nmem_memory_in_use = 0; +size_t nmem_memory_free = 0; + YAZ_EXPORT void nmem_mutex_create(NMEM_MUTEX *p) { NMEM_ENTER; @@ -166,11 +169,21 @@ YAZ_EXPORT void nmem_mutex_destroy(NMEM_MUTEX *p) } } -static nmem_block *freelist = NULL; /* "global" freelists */ -static nmem_control *cfreelist = NULL; +/** \brief free NMEM memory blocks . Reused in get_block */ +static struct nmem_block *freelist = NULL; + +/** \brief free NMEM control blocks. Reused in nmem_create */ +static struct nmem_control *cfreelist = NULL; + +/** \brief number NMEM's in use (number of nmem_controls not in free list) */ static int nmem_active_no = 0; + +/** \brief NMEM usage counter */ static int nmem_init_flag = 0; +/** \brief whether nmem blocks should be reassigned to heap */ +static int nmem_release_in_heap = 0; + #if NMEM_DEBUG struct nmem_debug_info { void *p; @@ -182,11 +195,21 @@ struct nmem_debug_info { struct nmem_debug_info *nmem_debug_list = 0; #endif -static void free_block(nmem_block *p) +static void free_block(struct nmem_block *p) { - memset(p->buf, 'Y', p->size); - p->next = freelist; - freelist = p; + nmem_memory_in_use -= p->size; + if (nmem_release_in_heap) + { + xfree(p->buf); + xfree(p); + } + else + { + memset(p->buf, 'Y', p->size); + p->next = freelist; + freelist = p; + nmem_memory_free += p->size; + } if (log_level) yaz_log (log_level, "nmem free_block p=%p", p); } @@ -194,7 +217,7 @@ static void free_block(nmem_block *p) #if NMEM_DEBUG void nmem_print_list (void) { - if(log_level) + if (log_level) nmem_print_list_l(log_level); } @@ -213,9 +236,9 @@ void nmem_print_list_l (int level) /* * acquire a block with a minimum of size free bytes. */ -static nmem_block *get_block(size_t size) +static struct nmem_block *get_block(size_t size) { - nmem_block *r, *l; + struct nmem_block *r, *l; if (log_level) yaz_log (log_level, "nmem get_block size=%ld", (long) size); @@ -231,6 +254,7 @@ static nmem_block *get_block(size_t size) l->next = r->next; else freelist = r->next; + nmem_memory_free -= r->size; } else { @@ -239,18 +263,20 @@ static nmem_block *get_block(size_t size) if (get < size) get = size; if(log_level) - yaz_log (log_level, "nmem get_block alloc new block size=%d", get); + yaz_log (log_level, "nmem get_block alloc new block size=%ld", + (long) get); - r = (nmem_block *)xmalloc(sizeof(*r)); + r = (struct nmem_block *) xmalloc(sizeof(*r)); r->buf = (char *)xmalloc(r->size = get); } + nmem_memory_in_use += r->size; r->top = 0; return r; } void nmem_reset(NMEM n) { - nmem_block *t; + struct nmem_block *t; yaz_log (log_level, "nmem_reset p=%p", n); if (!n) @@ -331,7 +357,7 @@ NMEM nmem_create(void) if (r) cfreelist = cfreelist->next; else - r = (nmem_control *)xmalloc(sizeof(*r)); + r = (struct nmem_control *)xmalloc(sizeof(*r)); NMEM_LEAVE; #if NMEM_DEBUG @@ -400,14 +426,21 @@ void nmem_destroy(NMEM n) nmem_reset(n); NMEM_ENTER; nmem_active_no--; - n->next = cfreelist; - cfreelist = n; + if (nmem_release_in_heap) + { + xfree(n); + } + else + { + n->next = cfreelist; + cfreelist = n; + } NMEM_LEAVE; } void nmem_transfer (NMEM dst, NMEM src) { - nmem_block *t; + struct nmem_block *t; while ((t = src->blocks)) { src->blocks = t->next; @@ -418,6 +451,20 @@ void nmem_transfer (NMEM dst, NMEM src) src->total = 0; } +void nmem_get_memory_in_use(size_t *p) +{ + NMEM_ENTER; + *p = nmem_memory_in_use; + NMEM_LEAVE; +} + +void nmem_get_memory_free(size_t *p) +{ + NMEM_ENTER; + *p = nmem_memory_free; + NMEM_LEAVE; +} + void nmem_critical_enter (void) { NMEM_ENTER; @@ -430,7 +477,6 @@ void nmem_critical_leave (void) void nmem_init (void) { - if (++nmem_init_flag == 1) { #ifdef WIN32 @@ -457,6 +503,7 @@ void nmem_exit (void) while (freelist) { struct nmem_block *fl = freelist; + nmem_memory_free -= fl->size; freelist = freelist->next; xfree (fl->buf); xfree (fl);