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