Changeset: 7969513d2479 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7969513d2479
Modified Files:
        gdk/gdk.h
        gdk/gdk_utils.c
        monetdb5/mal/mal_instruction.c
        monetdb5/mal/mal_instruction.h
        monetdb5/mal/mal_session.c
        monetdb5/optimizer/opt_inline.c
        monetdb5/optimizer/opt_mergetable.c
Branch: resource_management
Log Message:

reuse freed objects/blks


diffs (283 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -623,7 +623,7 @@ gdk_export char *sa_strconcat( allocator
 gdk_export size_t sa_size( allocator *sa );
 gdk_export void sa_open( allocator *sa );  /* open new frame of tempory 
allocations */
 gdk_export void sa_close( allocator *sa ); /* close temporary frame, reset to 
old state */
-gdk_export void sa_free( allocator *sa, void *);
+gdk_export void sa_free( allocator *sa, void *, size_t sz);
 
 #define ma_create(pa)          sa_create(pa)
 #define ma_destroy(ma)         sa_destroy(ma)
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -2083,36 +2083,33 @@ typedef struct freed_t {
        size_t sz;
 } freed_t;
 
-static void
-sa_destroy_freelist( freed_t *f )
-{
-       while(f) {
-               freed_t *n = f->n;
-               GDKfree(f);
-               f = n;
-       }
-}
+//static void
+//sa_destroy_freelist( freed_t *f )
+//{
+//     while(f) {
+//             freed_t *n = f->n;
+//             GDKfree(f);
+//             f = n;
+//     }
+//}
 
 static void
-sa_free_obj(allocator *pa, void *obj)
+sa_free_obj(allocator *pa, void *obj, size_t sz)
 {
-       assert(!pa->pa); // why ?
-       size_t sz = GDKmallocated(obj);
-       assert(sz < SA_BLOCK_SIZE);
+       assert(sz > 0);
+       assert(!pa->pa); // must be root allocator
        size_t i;
+       char *obj_start = (char *) obj;
+       char *obj_end = obj_start + sz;
 
-       // find the block this objects belongs
+       // find the block this object belongs to
        for(i = 0; i < pa->nr; i++) {
-               if (((char *) obj >= (char *) pa->blks[i]) && ((char *)obj < 
(char *) pa->blks[i] +
-                               SA_BLOCK_SIZE))
+               char * blk_start = (char *) pa->blks[i];
+               char * blk_end = blk_start + SA_BLOCK_SIZE;
+               if ((obj_start >= blk_start) && (obj_end <= blk_end))
                        break;
        }
        assert (i < pa->nr);
-       if (i >= pa->nr) {
-               // obj does not beong to any
-               // block in this allocator
-               return;
-       }
        // put on the freelist
        freed_t *f = obj;
        f->n = pa->freelist;
@@ -2123,7 +2120,7 @@ sa_free_obj(allocator *pa, void *obj)
 static void
 sa_free_blk(allocator *pa, void *blk)
 {
-       assert(!pa->pa); // why ?
+       assert(!pa->pa); // must be root allocator
        size_t i;
 
        for(i = 0; i < pa->nr; i++) {
@@ -2131,18 +2128,13 @@ sa_free_blk(allocator *pa, void *blk)
                        break;
        }
        assert (i < pa->nr);
-       if (i >= pa->nr) {
-               // blk does not belong to this allocator
-               return;
-       }
-       for (; i < pa->nr-1; i++)
-               pa->blks[i] = pa->blks[i+1];
-       pa->nr--;
 
        size_t sz = GDKmallocated(blk);
-       // what is the magic 32 ?
-       if (sz > (SA_BLOCK_SIZE + 32)) {
+       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->n = pa->freelist_blks;
@@ -2154,15 +2146,17 @@ sa_free_blk(allocator *pa, void *blk)
 
 
 /*
- * Returns first suitable block for the size
+ * Returns first that match size
  */
 static void *
 sa_use_freed_obj(allocator *pa, size_t sz)
 {
+       if (pa->pa)
+               return sa_use_freed_obj(pa->pa, sz);
        freed_t *prev = NULL;
        freed_t *curr = pa->freelist;
        while(curr) {
-               if (sz <= curr->sz) {
+               if (sz == curr->sz) {
                        if (prev) {
                                prev->n = curr->n;
                        } else {
@@ -2178,9 +2172,11 @@ sa_use_freed_obj(allocator *pa, size_t s
 }
 
 static void *
-sa_use_freed_blk(allocator *pa)
+sa_use_freed_blk(allocator *pa, size_t sz)
 {
-       if (pa->freelist_blks) {
+       if (pa->pa)
+               return sa_use_freed_blk(pa->pa, sz);
+       if (pa->freelist_blks && (sz == SA_BLOCK_SIZE)) {
                freed_t *f = pa->freelist_blks;
                pa->freelist_blks = f->n;
                return f;
@@ -2191,10 +2187,12 @@ sa_use_freed_blk(allocator *pa)
 static void *
 sa_use_freed(allocator *pa, size_t sz)
 {
-       if (sz < SA_BLOCK_SIZE && pa->freelist)
+       if ((sz < SA_BLOCK_SIZE) && pa->freelist) {
                return sa_use_freed_obj(pa, sz);
-       if (sz <= SA_BLOCK_SIZE && pa->freelist_blks)
-               return sa_use_freed_blk(pa);
+       }
+       if ((sz == SA_BLOCK_SIZE) && pa->freelist_blks) {
+               return sa_use_freed_blk(pa, sz);
+       }
        return NULL;
 }
 
@@ -2264,8 +2262,10 @@ sa_realloc( allocator *sa, void *p, size
 void *
 sa_alloc( allocator *sa, size_t sz )
 {
-       char *r;
        sz = round16(sz);
+       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);
@@ -2273,13 +2273,10 @@ sa_alloc( allocator *sa, size_t sz )
                if (sa->pa)
                        r = (char*)sa_alloc(sa->pa, sz > SA_BLOCK_SIZE ?
                                        sz : SA_BLOCK_SIZE);
-               else if (sz <= SA_BLOCK_SIZE && (sa->freelist_blks ||
-                                       sa->freelist)) {
-                       r = sa_use_freed(sa, sz);
-               } else {
+               else
                        r = GDKmalloc(sz > SA_BLOCK_SIZE ?
                                        sz : SA_BLOCK_SIZE);
-               }
+
                if (r == NULL) {
                        if (sa->eb.enabled)
                                eb_error(&sa->eb, "out of memory", 1000);
@@ -2339,9 +2336,8 @@ void sa_destroy( allocator *sa )
                sa_free_blk(sa->pa, sa->blks[0]);
                return;
        }
-
-       sa_destroy_freelist(sa->freelist);
-       sa_destroy_freelist(sa->freelist_blks);
+       // root allocator
+       // sa_destroy_freelist(sa->freelist_blks);
        for (size_t i = 0; i<sa->nr; i++) {
                GDKfree(sa->blks[i]);
        }
@@ -2411,12 +2407,9 @@ sa_close( allocator *sa )
 }
 
 void
-sa_free(allocator *sa, void *obj)
+sa_free(allocator *sa, void *obj, size_t sz)
 {
-       size_t sz = GDKmallocated(obj);
-       if (sz >= SA_BLOCK_SIZE) {
-               sa_free_blk(sa, obj);
-       } else {
-               sa_free_obj(sa, obj);
+       if (sz < SA_BLOCK_SIZE) {
+               sa_free_obj(sa, obj, sz);
        }
 }
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -477,11 +477,23 @@ freeInstruction(InstrPtr p)
 {
        MalBlkPtr mb_ptr = p->blk;
        if (mb_ptr && mb_ptr->ma) {
-               sa_free(mb_ptr->ma, p);
+               size_t sz = (p->maxarg - 1)*(sizeof(p->argv[0])) + 
(sizeof(InstrRecord));
+               sa_free(mb_ptr->ma, p, sz);
        }
        //GDKfree(p);
 }
 
+void
+freeInstructionX(InstrPtr p, MalBlkPtr mb)
+{
+       MalBlkPtr mb_ptr = (mb != NULL) ? mb : p->blk;
+       if (mb_ptr && mb_ptr->ma) {
+               size_t sz = (p->maxarg - 1)*(sizeof(p->argv[0])) + 
(sizeof(InstrRecord));
+               sa_free(mb_ptr->ma, p, sz);
+       }
+}
+
+
 /* Query optimizers walk their way through a MAL program block. They
  * require some primitives to move instructions around and to remove
  * superfluous instructions. The removal is based on the assumption
diff --git a/monetdb5/mal/mal_instruction.h b/monetdb5/mal/mal_instruction.h
--- a/monetdb5/mal/mal_instruction.h
+++ b/monetdb5/mal/mal_instruction.h
@@ -152,6 +152,7 @@ mal_export InstrPtr copyInstruction(MalB
 mal_export InstrPtr copyInstructionArgs(MalBlkPtr mb, const InstrRecord *p, 
int args);
 mal_export void clrInstruction(InstrPtr p);
 mal_export void freeInstruction(InstrPtr p);
+mal_export void freeInstructionX(InstrPtr p, MalBlkPtr mb);
 mal_export void clrFunction(InstrPtr p);
 mal_export Symbol newSymbol(const char *nme, int kind);
 mal_export void freeSymbol(Symbol s);
diff --git a/monetdb5/mal/mal_session.c b/monetdb5/mal/mal_session.c
--- a/monetdb5/mal/mal_session.c
+++ b/monetdb5/mal/mal_session.c
@@ -412,7 +412,7 @@ MSresetInstructions(MalBlkPtr mb, int st
        for (i = start; i < mb->ssize; i++) {
                p = getInstrPtr(mb, i);
                if (p)
-                       freeInstruction(p);
+                       freeInstructionX(p, mb);
                mb->stmt[i] = NULL;
        }
        mb->stop = start;
diff --git a/monetdb5/optimizer/opt_inline.c b/monetdb5/optimizer/opt_inline.c
--- a/monetdb5/optimizer/opt_inline.c
+++ b/monetdb5/optimizer/opt_inline.c
@@ -101,7 +101,7 @@ inlineMALblock(Client cntxt, MalBlkPtr m
        }
 
        /* copy the remainder of the stable part */
-       freeInstruction(p);
+       freeInstructionX(p, mb);
        for (i = pc + 1; i < mb->stop; i++) {
                ns[k++] = mb->stmt[i];
        }
diff --git a/monetdb5/optimizer/opt_mergetable.c 
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -2858,7 +2858,7 @@ OPTmergetableImplementation(Client cntxt
                for (i = 0; i < slimit; i++) {
                        if (old[i] && old[i]->token == ENDsymbol)       /* 
don't free optimizer calls */
                                break;
-                       freeInstruction(old[i]);
+                       freeInstructionX(old[i], mb);
                }
                //GDKfree(old);
        }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to