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

Reply via email to