Changeset: 355508e3b14c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=355508e3b14c
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/store.c
Branch: Jun2020
Log Message:

fixed leaks


diffs (151 lines):

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
@@ -959,6 +959,39 @@ delta_delete_val( sql_dbat *bat, oid rid
        return LOG_OK;
 }
 
+static void
+_destroy_dbat(sql_dbat *bat)
+{
+       assert(bat->r.refcnt == 0);
+       if (bat->dname)
+               _DELETE(bat->dname);
+       if (bat->dbid)
+               temp_destroy(bat->dbid);
+       if (bat->cached) {
+               bat_destroy(bat->cached);
+               bat->cached = NULL;
+       }
+       bat->dbid = 0;
+       bat->dname = NULL;
+       _DELETE(bat);
+}
+
+static int
+destroy_dbat(sql_trans *tr, sql_dbat *bat)
+{
+       sql_dbat *n;
+
+       (void)tr;
+       while(bat) {
+               n = bat->next;
+               if (sql_ref_dec(&bat->r) > 0)
+                       return LOG_OK;
+               _destroy_dbat(bat);
+               bat = n;
+       }
+       return LOG_OK;
+}
+
 static int
 bind_del_data(sql_trans *tr, sql_table *t)
 {
@@ -967,9 +1000,12 @@ bind_del_data(sql_trans *tr, sql_table *
                sql_dbat *bat = ZNEW(sql_dbat), *obat;
                if(!bat)
                        return LOG_ERR;
+               if (t->data)
+                       destroy_dbat(tr, t->data);
                t->data = bat;
                obat = timestamp_dbat(ot->data, t->base.stime);
                dup_dbat(tr, obat, bat, isNew(ot), isTempTable(t));
+               destroy_dbat(tr, obat);
                t->base.allocated = 1;
        }
        return LOG_OK;
@@ -1813,38 +1849,6 @@ log_destroy_idx(sql_trans *tr, sql_idx *
        return LOG_OK;
 }
 
-static void
-_destroy_dbat(sql_dbat *bat)
-{
-       if (sql_ref_dec(&bat->r) > 0)
-               return;
-       if (bat->dname)
-               _DELETE(bat->dname);
-       if (bat->dbid)
-               temp_destroy(bat->dbid);
-       if (bat->cached) {
-               bat_destroy(bat->cached);
-               bat->cached = NULL;
-       }
-       bat->dbid = 0;
-       bat->dname = NULL;
-       _DELETE(bat);
-}
-
-static int
-destroy_dbat(sql_trans *tr, sql_dbat *bat)
-{
-       sql_dbat *n;
-
-       (void)tr;
-       while(bat) {
-               n = bat->next;
-               _destroy_dbat(bat);
-               bat = n;
-       }
-       return LOG_OK;
-}
-
 static int
 cleanup(void)
 {
@@ -1886,9 +1890,9 @@ delayed_destroy_dbat(sql_dbat *b)
 
        if (!n)
                return LOG_OK;
+       MT_lock_set(&destroy_lock);
        while(n->next)
                n = n->next;
-       MT_lock_set(&destroy_lock);
        n->next = tobe_destroyed_dbat;
        tobe_destroyed_dbat = b;
        MT_lock_unset(&destroy_lock);
@@ -1900,7 +1904,7 @@ destroy_del(sql_trans *tr, sql_table *t)
 {
        int ok = LOG_OK;
 
-       if (t->data && t->base.allocated) {
+       if (t->data /* && t->base.allocated */) {
                t->base.allocated = 0;
                ok = destroy_dbat(tr, t->data);
        }
@@ -2701,8 +2705,11 @@ update_table(sql_trans *tr, sql_table *f
                        assert(tt->data);
                        if (tr_merge_dbat(tr, tt->data) != LOG_OK)
                                ok = LOG_ERR;
+                       if (ft->data)
+                               destroy_del(tr, ft);
                        ft->data = NULL;
                } else if (ft->data) {
+                       assert(!tt->data);
                        tt->data = ft->data;
                        tt->base.allocated = 1;
                        ft->data = NULL;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3467,6 +3467,8 @@ table_dup(sql_trans *tr, int flags, sql_
         * on savepoints from tr->parent to new tr */
        if (flags) {
                t->base.allocated = ot->base.allocated;
+               if (ot->data)
+                       (void)store_funcs.destroy_del(tr, ot);
                t->data = ot->data;
                ot->base.allocated = 0;
                ot->data = NULL;
@@ -3732,8 +3734,10 @@ trans_init(sql_trans *tr, backend_stack 
 
                                t->base.rtime = t->base.wtime = 0;
                                t->base.stime = pt->base.wtime;
-                               if (!istmp && !t->base.allocated)
+                               if (!istmp && !t->base.allocated) {
+                                       (void)store_funcs.destroy_del(tr, t);
                                        t->data = NULL;
+                               }
                                assert (istmp || !t->base.allocated);
 
                                if (pt->base.id == t->base.id) {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to