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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list