Changeset: 7702b0876080 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7702b0876080 Modified Files: clients/Tests/exports.stable.out gdk/gdk.h gdk/gdk_align.c gdk/gdk_bat.c gdk/gdk_bbp.c gdk/gdk_group.c gdk/gdk_heap.c gdk/gdk_imprints.c gdk/gdk_private.h gdk/gdk_search.c gdk/gdk_select.c gdk/gdk_storage.c gdk/gdk_unique.c Branch: Oct2014 Log Message:
Fix leaking of heap files. We introduce an extra argument to HEAPfree that tells it whether or not to remove the file that is associated with the heap. In a number of cases a heap is freed of which we know that it was a temporary heap that will not be used again (e.g. in cleanup code). This should fix a problem identified (and partially solved, albeit in a different way) by Richard Hughes. diffs (truncated from 541 to 300 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -289,7 +289,6 @@ void HEAP_free(Heap *heap, var_t block); void HEAP_initialize(Heap *heap, size_t nbytes, size_t nprivate, int alignment); var_t HEAP_malloc(Heap *heap, size_t nbytes); int HEAPextend(Heap *h, size_t size, int mayshare); -int HEAPfree(Heap *h); size_t HEAPmemsize(Heap *h); size_t HEAPvmsize(Heap *h); lng IMPSimprintsize(BAT *b); diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1035,7 +1035,7 @@ typedef int (*GDKfcn) (); * HEAPalloc (Heap *h, size_t nitems, size_t itemsize); * @item int * @tab - * HEAPfree (Heap *h); + * HEAPfree (Heap *h, int remove); * @item int * @tab * HEAPextend (Heap *h, size_t size, int mayshare); diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c --- a/gdk/gdk_align.c +++ b/gdk/gdk_align.c @@ -500,7 +500,7 @@ BATmaterializeh(BAT *b) BATsetcount(b, cnt); /* cleanup the old heaps */ - HEAPfree(&head); + HEAPfree(&head, 0); return b; } @@ -756,10 +756,10 @@ VIEWreset(BAT *b) BBPreclaim(v); if (n != NULL) BBPunfix(n->batCacheid); - HEAPfree(&head); - HEAPfree(&tail); - HEAPfree(&hh); - HEAPfree(&th); + HEAPfree(&head, 0); + HEAPfree(&tail, 0); + HEAPfree(&hh, 0); + HEAPfree(&th, 0); return NULL; } @@ -810,13 +810,13 @@ VIEWdestroy(BAT *b) VIEWunlink(b); if (b->htype && !b->H->heap.parentid) { - HEAPfree(&b->H->heap); + HEAPfree(&b->H->heap, 0); } else { b->H->heap.base = NULL; b->H->heap.filename = NULL; } if (b->ttype && !b->T->heap.parentid) { - HEAPfree(&b->T->heap); + HEAPfree(&b->T->heap, 0); } else { b->T->heap.base = NULL; b->T->heap.filename = NULL; diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -183,15 +183,15 @@ BATcreatedesc(int ht, int tt, int heapna return bs; bailout: if (ht) - HEAPfree(&bn->H->heap); + HEAPfree(&bn->H->heap, 1); if (tt) - HEAPfree(&bn->T->heap); + HEAPfree(&bn->T->heap, 1); if (bn->H->vheap) { - HEAPfree(bn->H->vheap); + HEAPfree(bn->H->vheap, 1); GDKfree(bn->H->vheap); } if (bn->T->vheap) { - HEAPfree(bn->T->vheap); + HEAPfree(bn->T->vheap, 1); GDKfree(bn->T->vheap); } GDKfree(bs); @@ -265,15 +265,15 @@ BATnewstorage(int ht, int tt, BUN cap, i } if (tt && HEAPalloc(&bn->T->heap, cap, bn->T->width) < 0) { if (ht) - HEAPfree(&bn->H->heap); + HEAPfree(&bn->H->heap, 1); return NULL; } if (ATOMheap(ht, bn->H->vheap, cap) < 0) { if (ht) - HEAPfree(&bn->H->heap); + HEAPfree(&bn->H->heap, 1); if (tt) - HEAPfree(&bn->T->heap); + HEAPfree(&bn->T->heap, 1); GDKfree(bn->H->vheap); if (bn->T->vheap) GDKfree(bn->T->vheap); @@ -281,11 +281,11 @@ BATnewstorage(int ht, int tt, BUN cap, i } if (ATOMheap(tt, bn->T->vheap, cap) < 0) { if (ht) - HEAPfree(&bn->H->heap); + HEAPfree(&bn->H->heap, 1); if (tt) - HEAPfree(&bn->T->heap); + HEAPfree(&bn->T->heap, 1); if (bn->H->vheap) { - HEAPfree(bn->H->vheap); + HEAPfree(bn->H->vheap, 1); GDKfree(bn->H->vheap); } GDKfree(bn->T->vheap); @@ -354,7 +354,7 @@ BATattach(int tt, const char *heapfile, if (rename(heapfile, path) < 0) { GDKsyserror("BATattach: cannot rename heapfile\n"); GDKfree(path); - HEAPfree(&bn->T->heap); + HEAPfree(&bn->T->heap, 1); GDKfree(bs); return NULL; } @@ -373,7 +373,7 @@ BATattach(int tt, const char *heapfile, bn->T->heap.size = (size_t) st.st_size; bn->T->heap.newstorage = bn->T->heap.storage = (bn->T->heap.size < GDK_mmap_minsize) ? STORE_MEM : STORE_MMAP; if (HEAPload(&bn->T->heap, BBP_physical(bn->batCacheid), "tail", TRUE) < 0) { - HEAPfree(&bn->T->heap); + HEAPfree(&bn->T->heap, 1); GDKfree(bs); return NULL; } @@ -560,20 +560,20 @@ BATclear(BAT *b, int force) if (b->T->vheap->free > 0 && ATOMheap(b->ttype, &th, cap) < 0) { if (b->H->vheap && b->H->vheap->free > 0) - HEAPfree(&hh); + HEAPfree(&hh, 1); return NULL; } } assert(b->H->vheap == NULL || b->H->vheap->parentid == abs(b->batCacheid)); if (b->H->vheap && b->H->vheap->free > 0) { hh.parentid = b->H->vheap->parentid; - HEAPfree(b->H->vheap); + HEAPfree(b->H->vheap, 0); *b->H->vheap = hh; } assert(b->T->vheap == NULL || b->T->vheap->parentid == abs(b->batCacheid)); if (b->T->vheap && b->T->vheap->free > 0) { th.parentid = b->T->vheap->parentid; - HEAPfree(b->T->vheap); + HEAPfree(b->T->vheap, 0); *b->T->vheap = th; } } else { @@ -632,20 +632,20 @@ BATfree(BAT *b) HASHdestroy(b); IMPSdestroy(b); if (b->htype) - HEAPfree(&b->H->heap); + HEAPfree(&b->H->heap, 0); else assert(!b->H->heap.base); if (b->ttype) - HEAPfree(&b->T->heap); + HEAPfree(&b->T->heap, 0); else assert(!b->T->heap.base); if (b->H->vheap) { assert(b->H->vheap->parentid == b->batCacheid); - HEAPfree(b->H->vheap); + HEAPfree(b->H->vheap, 0); } if (b->T->vheap) { assert(b->T->vheap->parentid == b->batCacheid); - HEAPfree(b->T->vheap); + HEAPfree(b->T->vheap, 0); } b = BBP_cache(-b->batCacheid); @@ -722,13 +722,13 @@ heapcopy(BAT *bn, char *ext, Heap *dst, } static void -heapfree(Heap *dst, Heap *src) +heapmove(Heap *dst, Heap *src) { if (src->filename == NULL) { src->filename = dst->filename; dst->filename = NULL; } - HEAPfree(dst); + HEAPfree(dst, 0); *dst = *src; } @@ -872,23 +872,23 @@ BATcopy(BAT *b, int ht, int tt, int writ (b->ttype && heapcopy(bn, "tail", &bthp, &b->T->heap) < 0) || (bn->H->vheap && heapcopy(bn, "hheap", &hhp, b->H->vheap) < 0) || (bn->T->vheap && heapcopy(bn, "theap", &thp, b->T->vheap) < 0)) { - HEAPfree(&thp); - HEAPfree(&hhp); - HEAPfree(&bthp); - HEAPfree(&bhhp); + HEAPfree(&thp, 1); + HEAPfree(&hhp, 1); + HEAPfree(&bthp, 1); + HEAPfree(&bhhp, 1); BBPreclaim(bn); return NULL; } /* succeeded; replace dummy small heaps by the * real ones */ - heapfree(&bn->H->heap, &bhhp); - heapfree(&bn->T->heap, &bthp); + heapmove(&bn->H->heap, &bhhp); + heapmove(&bn->T->heap, &bthp); hhp.parentid = bn->batCacheid; thp.parentid = bn->batCacheid; if (bn->H->vheap) - heapfree(bn->H->vheap, &hhp); + heapmove(bn->H->vheap, &hhp); if (bn->T->vheap) - heapfree(bn->T->vheap, &thp); + heapmove(bn->T->vheap, &thp); /* make sure we use the correct capacity */ hcap = (BUN) (bn->htype ? bn->H->heap.size >> bn->H->shift : 0); @@ -2941,10 +2941,7 @@ BATassertHeadProps(BAT *b) if (cmp == 0) seennil = 1; } - if (hp->storage == STORE_MEM) - HEAPfree(hp); - else - HEAPdelete(hp, nme, ext); + HEAPfree(hp, 1); GDKfree(hp); GDKfree(hs); GDKfree(ext); @@ -3197,10 +3194,7 @@ BATderiveHeadProps(BAT *b, int expensive } } if (hs) { - if (hp->storage == STORE_MEM) - HEAPfree(hp); - else - HEAPdelete(hp, nme, ext); + HEAPfree(hp, 1); GDKfree(hp); GDKfree(hs); GDKfree(ext); diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -561,10 +561,10 @@ fixoidheapcolumn(BAT *b, const char *src b->H->heap.free += b->H->width; Hputvalue(b, Hloc(b, i), s, 0); } - HEAPfree(&h1); - HEAPfree(&h2); + HEAPfree(&h1, 0); + HEAPfree(&h2, 0); HEAPsave(b->H->vheap, nme, htheap); - HEAPfree(b->H->vheap); + HEAPfree(b->H->vheap, 0); } else { assert(b->H->type == TYPE_oid || (b->H->type != TYPE_void && b->H->varsized)); @@ -600,10 +600,10 @@ fixoidheapcolumn(BAT *b, const char *src for (i = 0; i < b->batCount; i++) new[i] = old[i] == int_nil ? oid_nil : (oid) old[i]; b->H->heap.free = h1.free << 1; - HEAPfree(&h1); + HEAPfree(&h1, 0); } HEAPsave(&b->H->heap, nme, headtail); - HEAPfree(&b->H->heap); + HEAPfree(&b->H->heap, 0); if (ht < 0) b->H->type = ht; diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c --- a/gdk/gdk_group.c +++ b/gdk/gdk_group.c @@ -836,10 +836,7 @@ BATgroup_internal(BAT **groups, BAT **ex GRP_create_partial_hash_table_any(); } - if (hp->storage == STORE_MEM) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list