Allow a flag nmem_release_in_heap to be set (1) in which case
[yaz-moved-to-github.git] / src / nmem.c
index 6fb23fd..233abcc 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2005, 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.23 2006-08-09 14:00:18 adam Exp $
  */
 
 /**
@@ -109,17 +109,19 @@ struct nmem_mutex {
 
 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 +161,19 @@ 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_block *freelist = NULL;       /* "global" freelists */
 static nmem_control *cfreelist = NULL;
 static int nmem_active_no = 0;
 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,9 +187,17 @@ struct nmem_debug_info *nmem_debug_list = 0;
 
 static void free_block(nmem_block *p)
 {  
-    memset(p->buf, 'Y', p->size);
-    p->next = freelist;
-    freelist = p;
+    if (nmem_release_in_heap)
+    {
+        xfree(p->buf);
+        xfree(p);
+    }
+    else
+    {
+        memset(p->buf, 'Y', p->size);
+        p->next = freelist;
+        freelist = p;
+    }
     if (log_level)
         yaz_log (log_level, "nmem free_block p=%p", p);
 }
@@ -192,7 +205,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);
 }
 
@@ -232,12 +245,13 @@ static nmem_block *get_block(size_t 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->buf = (char *)xmalloc(r->size = get);
@@ -398,8 +412,15 @@ 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;
 }