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