* 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 $
*/
/**
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;
#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;
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);
}
#if NMEM_DEBUG
void nmem_print_list (void)
{
- if(log_level)
+ if (log_level)
nmem_print_list_l(log_level);
}
}
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);
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;
}