X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fnmem.c;h=ce08d99ed937edf80c020477e075b260ec6d174c;hb=be821514c869d68186361b5aab6bbfd1aa60e087;hp=6fb23fd6cb8d76527a1df836b8f4006fc58f4bc4;hpb=fb6d99a0c7e07d9cc4a315c447deaf6564a85505;p=yaz-moved-to-github.git diff --git a/src/nmem.c b/src/nmem.c index 6fb23fd..ce08d99 100644 --- a/src/nmem.c +++ b/src/nmem.c @@ -1,8 +1,8 @@ /* - * Copyright (C) 1995-2005, Index Data ApS + * Copyright (C) 1995-2007, 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.29 2007-04-12 13:52:57 adam Exp $ */ /** @@ -27,7 +27,6 @@ #include #include #include -#include #ifdef WIN32 #include @@ -54,7 +53,7 @@ struct nmem_block struct nmem_control { int total; - nmem_block *blocks; + struct nmem_block *blocks; struct nmem_control *next; }; @@ -107,19 +106,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 +163,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 +194,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 +216,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 +235,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 +253,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 +356,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 +425,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 +450,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 +476,6 @@ void nmem_critical_leave (void) void nmem_init (void) { - if (++nmem_init_flag == 1) { #ifdef WIN32 @@ -451,10 +498,10 @@ void nmem_exit (void) { if (--nmem_init_flag == 0) { - oid_exit(); while (freelist) { struct nmem_block *fl = freelist; + nmem_memory_free -= fl->size; freelist = freelist->next; xfree (fl->buf); xfree (fl);