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

experiment with larger arena sizes


diffs (256 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2574,13 +2574,14 @@ gdk_export _Noreturn void eb_error(excep
 
 typedef struct allocator {
        struct allocator *pa;
-       size_t size;    /* size of the allocator in terms of blocks */
-       size_t nr;      /* number of blocks allocated */
+       size_t size;     /* size of the allocator in terms of blocks */
+       size_t nr;       /* number of blocks allocated */
        char **blks;
-       size_t used;    /* memory used in last block */
-       size_t usedmem; /* used memory */
-       size_t objects; /* number of objects */
-       size_t inuse;   /* number of objects in use*/
+       size_t used;     /* memory used in last block */
+       size_t usedmem;  /* total used memory */
+       size_t blk_size; /* size of the last allocated block */
+       size_t objects;  /* number of objects */
+       size_t inuse;    /* number of objects in use*/
        size_t freelist_hits; /* number of object reuse*/
        void *freelist; /* list of freed objects */
        void *freelist_blks;    /* list of freed blks */
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -2070,7 +2070,7 @@ eb_error(exception_buffer *eb, const cha
 }
 
 #define SA_NUM_BLOCKS 64
-#define SA_BLOCK_SIZE (64*1024)
+#define SA_BLOCK_SIZE (128*1024)
 #define SA_HEADER_SIZE 2*(sizeof(size_t))
 #define CANARY_VALUE ((size_t)0xDEADBEEFDEADBEEF)
 
@@ -2104,36 +2104,55 @@ sa_free_obj(allocator *pa, void *obj, si
                pa->inuse -= 1;
 }
 
-static void
-sa_free_blk(allocator *pa, void *blk)
-{
-       // free blks are maintained on the root allocator
-       if (pa->pa) {
-               sa_free_blk(pa->pa, blk);
-       } else {
-               size_t i;
-
-               for(i = 0; i < pa->nr; i++) {
-                       if (pa->blks[i] == blk)
-                               break;
-               }
-               assert (i < pa->nr);
-
-               size_t sz = GDKmallocated(blk);
-               if (sz > (SA_BLOCK_SIZE)) {
-                       GDKfree(blk);
-                       for (; i < pa->nr-1; i++)
-                               pa->blks[i] = pa->blks[i+1];
-                       pa->nr--;
-               } else {
-                       freed_t *f = blk;
-                       f->sz = sz;
-                       f->n = pa->freelist_blks;
-                       pa->freelist_blks = f;
-               }
-       }
-}
-
+//static void
+//sa_free_blk(allocator *sa, void *blk)
+//{
+//     // blks are maintained on the root allocator
+//     if (sa->pa == NULL) {
+//             size_t i;
+//
+//             for(i = 0; i < sa->nr; i++) {
+//                     if (sa->blks[i] == blk)
+//                             break;
+//             }
+//             assert (i < sa->nr);
+//
+//             GDKfree(blk);
+//             for (; i < sa->nr-1; i++)
+//                     sa->blks[i] = sa->blks[i+1];
+//             sa->nr--;
+//     }
+//     // free blks are maintained on the root allocator
+//     //if (pa->pa) {
+//     //      sa_free_blk(pa->pa, blk);
+//     //} else {
+//     //      size_t i;
+//
+//     //      for(i = 0; i < pa->nr; i++) {
+//     //              if (pa->blks[i] == blk)
+//     //                      break;
+//     //      }
+//     //      assert (i < pa->nr);
+//
+//     //      // size_t sz = GDKmallocated(blk);
+//     //      GDKfree(blk);
+//     //      for (; i < pa->nr-1; i++)
+//     //              pa->blks[i] = pa->blks[i+1];
+//     //      pa->nr--;
+//     //      //if (sz > (SA_BLOCK_SIZE)) {
+//     //      //      GDKfree(blk);
+//     //      //      for (; i < pa->nr-1; i++)
+//     //      //              pa->blks[i] = pa->blks[i+1];
+//     //      //      pa->nr--;
+//     //      //} else {
+//     //      //      freed_t *f = blk;
+//     //      //      f->sz = sz;
+//     //      //      f->n = pa->freelist_blks;
+//     //      //      pa->freelist_blks = f;
+//     //      //}
+//     //}
+//}
+//
 
 /*
  * Return first slot that will fit the size
@@ -2191,19 +2210,21 @@ sa_use_freed(allocator *pa, size_t sz)
 
 allocator *sa_reset(allocator *sa)
 {
-       size_t i ;
+       size_t i;
 
        for (i = 1; i < sa->nr; i++) {
-               if (!sa->pa)
+               if (sa->pa == NULL) {
                        GDKfree(sa->blks[i]);
-               else
-                       sa_free_blk(sa->pa, sa->blks[i]);
+               }
+               sa->blks[i] = NULL;
        }
+
        sa->freelist_blks = NULL;
        sa->nr = 1;
        sa->used = 0;
        sa->freelist = NULL;
        sa->usedmem = SA_BLOCK_SIZE;
+       sa->blk_size = SA_BLOCK_SIZE;
        sa->objects = 0;
        sa->inuse = 0;
        return sa;
@@ -2243,15 +2264,18 @@ static void *
        char *r = sa_use_freed(sa, sz);
        if (r)
                return r;
-       /* we don't want super large allocs for temp storage */
-       //if (sa->tmp_active && sz >= SA_BLOCK_SIZE)
-       //      assert(0);
-       if (sz > (SA_BLOCK_SIZE - sa->used)) {
-               size_t nsize = (sz > SA_BLOCK_SIZE) ? sz : SA_BLOCK_SIZE;
-               if (sa->pa)
+       if (sz > (sa->blk_size - sa->used)) {
+               // out of space need new blk
+               size_t nsize = sa->blk_size;
+               // double the size
+               do {
+                       nsize *= 2;
+               } while(sz > nsize);
+               if (sa->pa) {
                        r = (char*) _sa_alloc_internal(sa->pa, nsize);
-               else
+               } else {
                        r = GDKmalloc(nsize);
+               }
 
                if (r == NULL) {
                        if (sa->eb.enabled)
@@ -2276,18 +2300,23 @@ static void *
                        }
                        sa->blks = tmp;
                }
-               if (sz > SA_BLOCK_SIZE) {
-                       // move odd size blks behind
-                       sa->blks[sa->nr] = sa->blks[sa->nr-1];
-                       sa->blks[sa->nr-1] = r;
-                       sa->nr ++;
-                       sa->usedmem += sz;
-               } else {
-                       sa->blks[sa->nr] = r;
-                       sa->nr ++;
-                       sa->used = sz;
-                       sa->usedmem += SA_BLOCK_SIZE;
-               }
+               sa->blk_size = nsize;
+               sa->blks[sa->nr] = r;
+               sa->nr ++;
+               sa->used = sz;
+               sa->usedmem += sa->blk_size;
+               //if (sz > SA_BLOCK_SIZE) {
+               //      // move odd size blks behind
+               //      sa->blks[sa->nr] = sa->blks[sa->nr-1];
+               //      sa->blks[sa->nr-1] = r;
+               //      sa->nr ++;
+               //      sa->usedmem += sz;
+               //} else {
+               //      sa->blks[sa->nr] = r;
+               //      sa->nr ++;
+               //      sa->used = sz;
+               //      sa->usedmem += SA_BLOCK_SIZE;
+               //}
        } else {
                r = sa->blks[sa->nr-1] + sa->used;
                sa->used += sz;
@@ -2339,6 +2368,7 @@ sa_create(allocator *pa)
        sa->pa = pa;
        sa->nr = 1;
        sa->usedmem = SA_BLOCK_SIZE;
+       sa->blk_size = SA_BLOCK_SIZE;
        sa->freelist = NULL;
        sa->freelist_blks = NULL;
        sa->used = 0;
@@ -2364,17 +2394,19 @@ sa_zalloc( allocator *sa, size_t sz )
 void
 sa_destroy( allocator *sa )
 {
-       if (sa->pa) {
-               sa_reset(sa);
-               sa_free_blk(sa->pa, sa->blks[0]);
-               return;
+       //if (sa->pa) {
+       //      sa_reset(sa);
+       //      sa_free_blk(sa->pa, sa->blks[0]);
+       //      return;
+       //}
+       if (sa->pa == NULL) {
+               // root allocator
+               for (size_t i = 0; i < sa->nr; i++) {
+                       GDKfree(sa->blks[i]);
+               }
+               GDKfree(sa->blks);
+               GDKfree(sa);
        }
-       // root allocator
-       for (size_t i = 0; i<sa->nr; i++) {
-               GDKfree(sa->blks[i]);
-       }
-       GDKfree(sa->blks);
-       GDKfree(sa);
 }
 
 #undef sa_strndup
@@ -2446,6 +2478,6 @@ sa_free(allocator *sa, void *obj)
        if (sz < SA_BLOCK_SIZE) {
                sa_free_obj(sa, ptr, sz);
        } else {
-               sa_free_blk(sa, ptr);
+               // sa_free_blk(sa, ptr);
        }
 }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to