Changeset: 693ec649c6d9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=693ec649c6d9
Modified Files:
gdk/gdk.h
gdk/gdk_align.c
gdk/gdk_batop.c
gdk/gdk_bbp.c
gdk/gdk_heap.c
gdk/gdk_logger.c
gdk/gdk_project.c
sql/backends/monet5/sql.c
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_utils.c
sql/storage/bat/bat_utils.h
Branch: unlock
Log Message:
more leak fixing
diffs (truncated from 459 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -851,6 +851,7 @@ gdk_export gdk_return HEAPextend(Heap *h
gdk_export size_t HEAPvmsize(Heap *h);
gdk_export size_t HEAPmemsize(Heap *h);
gdk_export void HEAPdecref(Heap *h, bool remove);
+gdk_export void HEAPincref(Heap *h);
/*
* @- Internal HEAP Chunk Management
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -109,9 +109,9 @@ VIEWcreate(oid seq, BAT *b)
bn->batCapacity = b->batCapacity;
MT_lock_set(&b->theaplock);
bn->T = b->T;
- (void) ATOMIC_INC(&b->theap->refs);
+ HEAPincref(b->theap);
if (b->tvheap)
- (void) ATOMIC_INC(&b->tvheap->refs);
+ HEAPincref(b->tvheap);
MT_lock_unset(&b->theaplock);
if (tp)
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -124,7 +124,7 @@ insert_string_bat(BAT *b, BAT *n, struct
if (b->tvheap->parentid != bid)
BBPunshare(b->tvheap->parentid);
HEAPdecref(b->tvheap, true);
- (void) ATOMIC_INC(&n->tvheap->refs);
+ HEAPincref(n->tvheap);
b->tvheap = n->tvheap;
BBPshare(n->tvheap->parentid);
MT_lock_unset(&b->theaplock);
@@ -433,7 +433,7 @@ append_varsized_bat(BAT *b, BAT *n, stru
BBPunshare(b->tvheap->parentid);
BBPshare(n->tvheap->parentid);
HEAPdecref(b->tvheap, true);
- (void) ATOMIC_INC(&n->tvheap->refs);
+ HEAPincref(n->tvheap);
b->tvheap = n->tvheap;
MT_lock_unset(&b->theaplock);
MT_lock_unset(&n->theaplock);
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2399,6 +2399,10 @@ incref(bat i, bool logical, bool lock)
assert(!logical);
if (tp) {
assert(pb != NULL);
+ if (b->theap != pb->theap) {
+ HEAPincref(pb->theap);
+ HEAPdecref(b->theap, false);
+ }
b->theap = pb->theap;
}
/* done loading, release descriptor */
@@ -2492,6 +2496,7 @@ decref(bat i, bool logical, bool release
assert(b == NULL || b->tvheap == NULL ||
BBP_refs(b->tvheap->parentid) > 0);
refs = --BBP_refs(i);
if (b && refs == 0) {
+ tp = VIEWtparent(b);
tvp = VIEWvtparent(b);
}
}
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -710,6 +710,7 @@ void
HEAPdecref(Heap *h, bool remove)
{
h->remove |= remove;
+ //printf("dec ref(%d) %p %d\n", (int)h->refs, h, h->parentid);
if (ATOMIC_DEC(&h->refs) == 0) {
ATOMIC_DESTROY(&h->refs);
HEAPfree(h, h->remove);
@@ -717,6 +718,13 @@ HEAPdecref(Heap *h, bool remove)
}
}
+void
+HEAPincref(Heap *h)
+{
+ //printf("inc ref(%d) %p %d\n", (int)h->refs, h, h->parentid);
+ (void)ATOMIC_INC(&h->refs);
+}
+
/*
* @- HEAPload
*
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -562,8 +562,10 @@ la_bat_updates(logger *lg, logaction *la
}
}
cnt = (BUN)(la->offset + la->nr);
- if (la_bat_update_count(lg, la->cid, cnt) != GDK_SUCCEED)
+ if (la_bat_update_count(lg, la->cid, cnt) != GDK_SUCCEED) {
+ logbat_destroy(b);
return GDK_FAIL;
+ }
} else if (!lg->flushing && la->type == LOG_UPDATE) {
BATiter vi = bat_iterator(la->b);
BUN p, q;
@@ -643,8 +645,10 @@ la_bat_create(logger *lg, logaction *la)
BATtseqbase(b, 0);
if (BATsetaccess(b, BAT_READ) != GDK_SUCCEED ||
- logger_add_bat(lg, b, la->cid) != GDK_SUCCEED)
+ logger_add_bat(lg, b, la->cid) != GDK_SUCCEED) {
+ logbat_destroy(b);
return GDK_FAIL;
+ }
logbat_destroy(b);
return GDK_SUCCEED;
}
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -448,7 +448,7 @@ BATproject2(BAT *restrict l, BAT *restri
assert(r1->tvheap->parentid > 0);
BBPshare(r1->tvheap->parentid);
bn->tvheap = r1->tvheap;
- (void) ATOMIC_INC(&r1->tvheap->refs);
+ HEAPincref(r1->tvheap);
MT_lock_unset(&r1->theaplock);
} else {
/* make copy of string heap */
@@ -682,7 +682,7 @@ BATprojectchain(BAT **bats)
MT_lock_set(&b->theaplock);
BBPshare(b->tvheap->parentid);
bn->tvheap = b->tvheap;
- (void) ATOMIC_INC(&b->tvheap->refs);
+ HEAPincref(b->tvheap);
MT_lock_unset(&b->theaplock);
bn->ttype = b->ttype;
bn->tvarsized = true;
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -2294,7 +2294,7 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
if (ui) BBPunfix(ui->batCacheid);
if (uv) BBPunfix(uv->batCacheid);
- if (!nui || !nuv || BATreplace(bn, nui, nuv, true) !=
GDK_SUCCEED) {
+ if (!nui || !nuv || BATreplace(bn, nui, nuv, true) !=
GDK_SUCCEED) {
if (bn) BBPunfix(bn->batCacheid);
if (nui) BBPunfix(nui->batCacheid);
if (nuv) BBPunfix(nuv->batCacheid);
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -181,6 +181,7 @@ count_deletes(storage *d)
bat_destroy(b);
return 0;
}
+ bat_destroy(b);
} else {
BAT *ui, *uv, *c;
@@ -192,16 +193,18 @@ count_deletes(storage *d)
c = COLcopy(b, b->ttype, true, TRANSIENT);
bat_destroy(b);
if (BATreplace(c, ui, uv, true) != GDK_SUCCEED) {
- BBPunfix(c->batCacheid);
+ bat_destroy(ui);
+ bat_destroy(uv);
+ bat_destroy(c);
return 0;
}
- BBPunfix(ui->batCacheid);
- BBPunfix(uv->batCacheid);
+ bat_destroy(ui);
+ bat_destroy(uv);
if (BATsum(&cnt, TYPE_lng, c, NULL, true, false, false) !=
GDK_SUCCEED) {
- BBPunfix(c->batCacheid);
+ bat_destroy(c);
return 0;
}
- BBPunfix(c->batCacheid);
+ bat_destroy(c);
}
return cnt;
}
@@ -240,19 +243,7 @@ cs_bind_ubat( column_storage *cs, int ac
else
b = temp_descriptor(cs->uvbid);
} else {
- log_bid bb;
-
- if (access == RD_UPD_ID) {
- bb = e_bat(TYPE_oid);
- if(bb == BID_NIL)
- return NULL;
- b = temp_descriptor(bb);
- } else {
- bb = e_bat(type);
- if(bb == BID_NIL)
- return NULL;
- b = temp_descriptor(bb);
- }
+ b = e_BAT(access == RD_UPD_ID?TYPE_oid:type);
}
return b;
}
@@ -272,7 +263,9 @@ cs_bind_bat( column_storage *cs, int acc
return NULL;
bat_set_access(b, BAT_READ);
/* return slice */
- return BATslice(b, 0, cnt);
+ BAT *s = BATslice(b, 0, cnt);
+ bat_destroy(b);
+ return s;
}
static BAT *
@@ -381,8 +374,7 @@ cs_update_bat( column_storage *cs, BAT *
res = LOG_ERR;
else if (BATreplace(b, otids, updates, true) != GDK_SUCCEED)
res = LOG_ERR;
- if (b)
- bat_destroy(b);
+ bat_destroy(b);
}
if (otids != tids)
bat_destroy(otids);
@@ -455,12 +447,6 @@ dup_cs(column_storage *ocs, column_stora
return LOG_ERR;
} else {
(void)c_isnew;
- /* move the bat to the new col, fixup the old col*/
- //if (oc_isnew) {
- // BAT *b = ...
- // bat_set_access(b, BAT_READ);
- // bat_destroy(b);
- //}
temp_dup(cs->bid);
}
if (!temp) {
@@ -595,6 +581,7 @@ delta_append_bat( sql_delta *bat, size_t
bat_destroy(ui);
return LOG_ERR;
}
+ assert(!isVIEW(b));
bat_destroy(ui);
} else {
//assert (isNew(t) || isTempTable(t) || bat->cs.cleared);
@@ -611,17 +598,16 @@ delta_append_bat( sql_delta *bat, size_t
}
}
if (isVIEW(oi) && b->batCacheid == VIEWtparent(oi)) {
- BAT *ic = COLcopy(oi, oi->ttype, true, TRANSIENT);
+ BAT *ic = COLcopy(oi, oi->ttype, true, TRANSIENT);
if (ic == NULL || BATappend(b, ic, NULL, true) !=
GDK_SUCCEED) {
if (oi != i)
bat_destroy(oi);
- if(ic)
- bat_destroy(ic);
- bat_destroy(b);
- return LOG_ERR;
- }
- bat_destroy(ic);
+ bat_destroy(ic);
+ bat_destroy(b);
+ return LOG_ERR;
+ }
+ bat_destroy(ic);
} else if (BATappend(b, oi, NULL, true) != GDK_SUCCEED) {
if (oi != i)
bat_destroy(oi);
@@ -631,6 +617,7 @@ delta_append_bat( sql_delta *bat, size_t
}
if (oi != i)
bat_destroy(oi);
+ assert(!isVIEW(b));
bat_destroy(b);
return LOG_OK;
}
@@ -835,17 +822,16 @@ delta_delete_bat( storage *bat, BAT *i,
BAT *t, *oi = i;
if (i->ttype == TYPE_msk || mask_cand(i))
- i = BATunmask(i);
+ i = BATunmask(i);
t = BATconstant(i->hseqbase, TYPE_msk, &T, BATcount(i), TRANSIENT);
int ok = LOG_OK;
assert(i->ttype != TYPE_msk);
- if (t) {
+ if (t)
ok = cs_update_bat( &bat->cs, i, t, is_new);
- }
- BBPunfix(t->batCacheid);
+ bat_destroy(t);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list