X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fnmem.c;h=484836c5830ac82a2a31df1fc646a40d366118eb;hb=7b43d0bb4e3c154246bdaba51b78e9861fd3bd97;hp=4f2504e28d83b4a58856a715ed02932091aa5a75;hpb=fe575eb97799f141b6e97d17c0e64619c4a9cd03;p=yaz-moved-to-github.git diff --git a/src/nmem.c b/src/nmem.c index 4f2504e..484836c 100644 --- a/src/nmem.c +++ b/src/nmem.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: nmem.c,v 1.14 2005-01-21 09:23:27 adam Exp $ + * $Id: nmem.c,v 1.18 2005-06-07 19:47:31 adam Exp $ */ /** @@ -43,6 +43,21 @@ #define NMEM_CHUNK (4*1024) +struct nmem_block +{ + char *buf; /* memory allocated in this block */ + size_t size; /* size of buf */ + size_t top; /* top of buffer */ + struct nmem_block *next; +}; + +struct nmem_control +{ + int total; + nmem_block *blocks; + struct nmem_control *next; +}; + struct align { char x; union { @@ -94,12 +109,6 @@ struct nmem_mutex { YAZ_EXPORT void nmem_mutex_create(NMEM_MUTEX *p) { - if (!log_level_initialized) - { - log_level = yaz_log_module_level("nmem"); - log_level_initialized = 1; - } - if (!*p) { *p = (NMEM_MUTEX) malloc (sizeof(**p)); @@ -111,6 +120,12 @@ YAZ_EXPORT void nmem_mutex_create(NMEM_MUTEX *p) pth_mutex_init (&(*p)->m_handle); #endif } + if (!log_level_initialized) + { + log_level_initialized = 1; + log_level = yaz_log_module_level("nmem"); + } + } YAZ_EXPORT void nmem_mutex_enter(NMEM_MUTEX p) @@ -196,12 +211,12 @@ void nmem_print_list_l (int level) /* * acquire a block with a minimum of size free bytes. */ -static nmem_block *get_block(int size) +static nmem_block *get_block(size_t size) { nmem_block *r, *l; if (log_level) - yaz_log (log_level, "nmem get_block size=%d", size); + yaz_log (log_level, "nmem get_block size=%ld", (long) size); for (r = freelist, l = 0; r; l = r, r = r->next) if (r->size >= size) @@ -273,7 +288,7 @@ void *nmem_malloc(NMEM n, int size) #endif NMEM_ENTER; p = n->blocks; - if (!p || p->size - p->top < size) + if (!p || p->size < size + p->top) { p = get_block(size); p->next = n->blocks;