Changeset: 2f8a282040fa for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2f8a282040fa
Modified Files:
        gdk/gdk_utils.c
Branch: resource_management
Log Message:

fix free_blk list reuse


diffs (144 lines):

diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -2181,7 +2181,8 @@ sa_free_blk(allocator *sa, void *blk)
                assert (i < sa->nr);
 
                // all blks are GDKmalloc
-               size_t sz = GDKmallocated(blk);
+               size_t sz = GDKmallocated(blk) - (MALLOC_EXTRA_SPACE + 
DEBUG_SPACE);
+               assert(sz > 0);
                if (sz == SA_BLOCK_SIZE) {
                        freed_t *f = blk;
                        f->sz = sz;
@@ -2230,6 +2231,9 @@ sa_use_freed_obj(allocator *sa, size_t s
        return NULL;
 }
 
+static int sa_double_num_blks(allocator *sa);
+
+
 /*
  * Free blocks are maintain at top level
  */
@@ -2240,8 +2244,18 @@ sa_use_freed_blk(allocator *sa, size_t s
                return sa_use_freed_blk(sa->pa, sz);
        COND_LOCK_ALLOCATOR(sa);
        if (sa->freelist_blks && (sz == SA_BLOCK_SIZE)) {
+               if (sa->nr >= sa->size && sa_double_num_blks(sa) < 0) {
+                       COND_UNLOCK_ALLOCATOR(sa);
+                       if (sa->eb.enabled)
+                               eb_error(&sa->eb, "out of memory", 1000);
+                       return NULL;
+               }
                freed_t *f = sa->freelist_blks;
                sa->freelist_blks = f->n;
+               sa->blk_size = SA_BLOCK_SIZE;
+               sa->used = SA_BLOCK_SIZE;
+               sa->blks[sa->nr] = (char*)f;
+               sa->nr ++;
                sa->free_blk_hits += 1;
                COND_UNLOCK_ALLOCATOR(sa);
                return f;
@@ -2317,7 +2331,7 @@ sa_realloc(allocator *sa, void *p, size_
 }
 
 static char *
-fill_in_header(char *r, size_t sz)
+sa_fill_in_header(char *r, size_t sz)
 {
        if (r) {
                // store size first
@@ -2329,6 +2343,31 @@ fill_in_header(char *r, size_t sz)
        return r;
 }
 
+static int
+sa_double_num_blks(allocator *sa)
+{
+       char **tmp;
+       size_t osz = sa->size;
+       sa->size *=2;
+       if (sa->pa)
+               tmp = (char**)_sa_alloc_internal(sa->pa, sizeof(char*) * 
sa->size);
+       else {
+               tmp = GDKmalloc(sizeof(char*) * sa->size);
+       }
+       if (tmp) {
+               bool reallocated = sa->blks != (char **)sa->first_blk;
+               memcpy(tmp, sa->blks, sizeof(char*) * osz);
+               if (!sa->pa && reallocated) {
+                       GDKfree(sa->blks);
+               }
+       } else {
+               sa->size /= 2; /* undo */
+               return -1;
+       }
+       sa->blks = tmp;
+       return 0;
+}
+
 
 static void *
 _sa_alloc_internal(allocator *sa, size_t sz)
@@ -2358,32 +2397,13 @@ static void *
                        return NULL;
                }
 
-               if (sa->nr >= sa->size) {
-                       char **tmp;
-                       size_t osz = sa->size;
-                       sa->size *=2;
-                       if (sa->pa)
-                               tmp = (char**)_sa_alloc_internal(sa->pa, 
sizeof(char*) * sa->size);
-                       else {
-                               tmp = GDKmalloc(sizeof(char*) * sa->size);
-                       }
-                       if (tmp && sa->blks) {
-                               bool reallocated = sa->blks != (char 
**)sa->first_blk;
-                               memcpy(tmp, sa->blks, sizeof(char*) * osz);
-                               if (!sa->pa && reallocated) {
-                                       GDKfree(sa->blks);
-                               }
-                       }
-                       if (tmp == NULL) {
-                               sa->size /= 2; /* undo */
-                               COND_UNLOCK_ALLOCATOR(sa);
-                               if (sa->eb.enabled)
-                                       eb_error(&sa->eb, "out of memory", 
1000);
-                               if (!sa->pa)
-                                       GDKfree(r);
-                               return NULL;
-                       }
-                       sa->blks = tmp;
+               if (sa->nr >= sa->size && sa_double_num_blks(sa) < 0) {
+                       COND_UNLOCK_ALLOCATOR(sa);
+                       if (sa->eb.enabled)
+                               eb_error(&sa->eb, "out of memory", 1000);
+                       if (!sa->pa)
+                               GDKfree(r);
+                       return NULL;
                }
                sa->blk_size = blk_size;
                sa->blks[sa->nr] = r;
@@ -2413,7 +2433,7 @@ sa_alloc(allocator *sa, size_t sz)
        //      *((size_t *) r + 1) = CANARY_VALUE;
        //      return r + SA_HEADER_SIZE;
        //}
-       return fill_in_header(r, sz);
+       return sa_fill_in_header(r, sz);
 }
 
 
@@ -2490,6 +2510,11 @@ sa_destroy(allocator *sa)
                if (root_allocator) {
                        if (blks_relocated)
                                GDKfree(sa->blks);
+                       while(sa->freelist_blks) {
+                               freed_t *f = sa->freelist_blks;
+                               sa->freelist_blks = f->n;
+                               GDKfree(f);
+                       }
                        GDKfree(sa->first_blk);
                } else {
                        sa_free_blk(sa, sa->first_blk);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to