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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list