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

Reply via email to