X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fnmem.c;h=920d4e5fb880197fe50f5f1413ef866a22076285;hp=6fb23fd6cb8d76527a1df836b8f4006fc58f4bc4;hb=69cc5b167c5afbc8d14c0db30f9a5fb34dda0a24;hpb=fb6d99a0c7e07d9cc4a315c447deaf6564a85505 diff --git a/src/nmem.c b/src/nmem.c index 6fb23fd..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.19 2005-06-25 15:46:04 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,19 +107,24 @@ 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; if (!*p) { - *p = (NMEM_MUTEX) malloc (sizeof(**p)); + *p = (NMEM_MUTEX) malloc(sizeof(**p)); #ifdef WIN32 InitializeCriticalSection(&(*p)->m_handle); #elif YAZ_POSIX_THREADS - pthread_mutex_init (&(*p)->m_handle, 0); + pthread_mutex_init(&(*p)->m_handle, 0); #elif YAZ_GNU_THREADS - pth_mutex_init (&(*p)->m_handle); + pth_mutex_init(&(*p)->m_handle); #endif } + NMEM_LEAVE; if (!log_level_initialized) { log_level_initialized = 1; @@ -159,16 +164,26 @@ YAZ_EXPORT void nmem_mutex_destroy(NMEM_MUTEX *p) #ifdef WIN32 DeleteCriticalSection(&(*p)->m_handle); #endif - free (*p); + free(*p); *p = 0; } } -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; @@ -180,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); } @@ -192,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); } @@ -211,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); @@ -229,26 +254,29 @@ static nmem_block *get_block(size_t size) l->next = r->next; else freelist = r->next; + nmem_memory_free -= r->size; } else { - int get = NMEM_CHUNK; + size_t get = NMEM_CHUNK; 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) @@ -329,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 @@ -398,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; @@ -416,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; @@ -428,7 +477,6 @@ void nmem_critical_leave (void) void nmem_init (void) { - if (++nmem_init_flag == 1) { #ifdef WIN32 @@ -455,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);