Changeset: 2884b341859a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2884b341859a Modified Files: sql/backends/monet5/sql.c sql/storage/bat/bat_storage.c sql/storage/store.c Branch: nospare Log Message:
fixing some more leak/reference issues diffs (truncated from 341 to 300 lines): 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 @@ -1842,10 +1842,12 @@ mvc_append_exec_wrap(Client cntxt, MalBl sqlstore *store = m->session->tr->store; int ret; + ptr *res_cookie = getArgReference_ptr(stk, pci, 0); ptr cookie = *getArgReference_ptr(stk, pci, 1); ptr incoming = getArgReference(stk, pci, 2); int incoming_type = getArgType(mb, pci, 2); + *res_cookie = cookie; if (incoming_type > GDKatomcnt) incoming_type = TYPE_bat; @@ -1883,10 +1885,12 @@ mvc_update_exec_wrap(Client cntxt, MalBl sqlstore *store = m->session->tr->store; (void) mb; int ret; + ptr *res_cookie = getArgReference_ptr(stk, pci, 0); ptr cookie = *getArgReference_ptr(stk, pci, 1); bat tids_bat = *getArgReference_bat(stk, pci, 2); bat incoming_bat = *getArgReference_bat(stk, pci, 3); + *res_cookie = cookie; BAT *data = BATdescriptor(incoming_bat); if (data == NULL) throw(SQL, "sql.update_exec", SQLSTATE(HY005) "Cannot access column descriptor"); 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 @@ -763,7 +763,7 @@ bind_col_data(sql_trans *tr, sql_column if ((!tr->parent || !tr_version_of_parent(tr, obat->ts)) && obat->ts >= TRANSACTION_ID_BASE && !isTempTable(c->t)) /* abort */ return NULL; - obat = col_timestamp_delta(tr, c); + obat = timestamp_delta(tr, c->data, type, isTempTable(c->t)); sql_delta* bat = ZNEW(sql_delta); if(!bat) return NULL; @@ -1126,9 +1126,15 @@ delta_delete_val( sql_dbat *bat, oid rid return LOG_OK; } -static void -_destroy_dbat(sql_dbat *bat) +static int +destroy_dbat(sql_dbat *bat) { + int ok = LOG_OK; + + if (--bat->refcnt > 0) + return LOG_OK; + if (bat->next) + ok = destroy_dbat(bat->next); if (bat->dname) _DELETE(bat->dname); if (bat->dbid) @@ -1140,22 +1146,7 @@ static void bat->dbid = 0; bat->dname = NULL; _DELETE(bat); -} - -static int -destroy_dbat(sql_trans *tr, sql_dbat *bat) -{ - if (--bat->refcnt > 0) - return LOG_OK; - sql_dbat *n; - - (void)tr; - while(bat) { - n = bat->next; - _destroy_dbat(bat); - bat = n; - } - return LOG_OK; + return ok; } static sql_dbat * @@ -1733,7 +1724,7 @@ create_idx(sql_trans *tr, sql_idx *ni) sql_column *c = ni->t->columns.set->h->data; sql_delta *d; - d = timestamp_delta(tr, c->data, c->type.type->localtype, isTempTable(c->t)); + d = col_timestamp_delta(tr, c); /* Here we also handle indices created through alter stmts */ /* These need to be created aligned to the existing data */ if (d->bid) { @@ -1991,6 +1982,12 @@ log_destroy_delta(sql_trans *tr, sql_del static int destroy_delta(sql_delta *b) { + int ok = LOG_OK; + + if (--b->refcnt > 0) + return LOG_OK; + if (b->next) + ok = destroy_delta(b->next); if (b->name) _DELETE(b->name); if (b->ibid) @@ -2006,23 +2003,8 @@ destroy_delta(sql_delta *b) b->bid = b->ibid = b->uibid = b->uvbid = 0; b->name = NULL; b->cached = NULL; - return LOG_OK; -} - -static int -destroy_bat(sql_delta *b) -{ - if (--b->refcnt > 0) - return LOG_OK; - sql_delta *n; - - while(b) { - n = b->next; - destroy_delta(b); - _DELETE(b); - b = n; - } - return LOG_OK; + _DELETE(b); + return ok; } static int @@ -2031,7 +2013,7 @@ destroy_col(sqlstore *store, sql_column (void)store; int ok = LOG_OK; if (c->data) - ok = destroy_bat(c->data); + ok = destroy_delta(c->data); c->data = NULL; return ok; } @@ -2059,7 +2041,7 @@ destroy_idx(sqlstore *store, sql_idx *i) (void)store; int ok = LOG_OK; if (i->data) - ok = destroy_bat(i->data); + ok = destroy_delta(i->data); i->data = NULL; return ok; } @@ -2097,7 +2079,7 @@ destroy_del(sqlstore *store, sql_table * (void)store; int ok = LOG_OK; if (t->data) - ok = destroy_dbat(NULL, t->data); + ok = destroy_dbat(t->data); t->data = NULL; return ok; } @@ -2477,18 +2459,16 @@ tr_merge_delta( sql_trans *tr, sql_delta } static int -tr_merge_dbat(sql_trans *tr, sql_dbat *tdb) +tr_merge_dbat(sql_dbat *tdb) { - //sqlstore *store = tr->store; int ok = LOG_OK; if (tdb->cached) { bat_destroy(tdb->cached); tdb->cached = NULL; } - //assert(ATOMIC_GET(&store->nr_active)==1); if (tdb->next) { - ok = destroy_dbat(tr, tdb->next); + ok = destroy_dbat(tdb->next); tdb->next = NULL; } return ok; @@ -2600,7 +2580,7 @@ commit_update_col( sql_trans *tr, sql_ch } if (delta && delta != d) { if (delta->next) { - ok = destroy_bat(delta->next); + ok = destroy_delta(delta->next); delta->next = NULL; } } @@ -2670,7 +2650,7 @@ commit_update_idx( sql_trans *tr, sql_ch o->next = d->next; d->next = NULL; destroy_delta(d); - } if (ok == LOG_OK && !tr->parent) { + } else if (ok == LOG_OK && !tr->parent) { sql_delta *d = delta; /* clean up and merge deltas */ while (delta && delta->ts > oldest) { @@ -2678,7 +2658,7 @@ commit_update_idx( sql_trans *tr, sql_ch } if (delta && delta != d) { if (delta->next) { - ok = destroy_bat(delta->next); + ok = destroy_delta(delta->next); delta->next = NULL; } } @@ -2700,7 +2680,7 @@ savepoint_commit_dbat( sql_dbat *dbat, u od->next = n; *dbat = t; dbat->next = NULL; - _destroy_dbat(dbat); + destroy_dbat(dbat); return od; } } @@ -2769,7 +2749,7 @@ commit_update_del( sql_trans *tr, sql_ch else o->next = d->next; d->next = NULL; - _destroy_dbat(d); + destroy_dbat(d); } else if (ok == LOG_OK && !tr->parent) { sql_dbat *d = dbat; /* clean up and merge deltas */ @@ -2778,12 +2758,12 @@ commit_update_del( sql_trans *tr, sql_ch } if (dbat && dbat != d) { if (dbat->next) { - ok = destroy_dbat(tr, dbat->next); + ok = destroy_dbat(dbat->next); dbat->next = NULL; } } if (ok == LOG_OK && dbat == d && oldest == commit_ts) - ok = tr_merge_dbat(tr, dbat); + ok = tr_merge_dbat(dbat); } else if (ok == LOG_OK && tr->parent) {/* cleanup older save points */ t->data = savepoint_commit_dbat(dbat, commit_ts); } @@ -2873,7 +2853,7 @@ tc_gc_del( sql_store Store, sql_change * else o->next = d->next; d->next = NULL; - _destroy_dbat(d); + destroy_dbat(d); } #endif if (t->data != change->data) /* data is freed by commit */ diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3822,7 +3822,7 @@ sys_drop_default_object(sql_trans *tr, s seq = find_sql_sequence(tr, s, seq_name); if (seq && sql_trans_get_dependency_type(tr, seq->base.id, BEDROPPED_DEPENDENCY) > 0) { sys_drop_sequence(tr, seq, drop_action); - if (os_del(s->seqs, tr, seq->base.name, &seq->base)) + if (os_del(s->seqs, tr, seq->base.name, dup_base(&seq->base))) return -2; } } @@ -3923,7 +3923,7 @@ sys_drop_part(sql_trans *tr, sql_part *p /* merge table depends on part table */ sql_trans_drop_dependency(tr, pt->member->base.id, mt->base.id, TABLE_DEPENDENCY); - os_del(mt->s->parts, tr, pt->base.name, &pt->base); + os_del(mt->s->parts, tr, pt->base.name, dup_base(&pt->base)); store->table_api.table_delete(tr, sysobj, obj_oid); } @@ -4130,7 +4130,7 @@ sql_trans_drop_type(sql_trans *tr, sql_s sql_type *t = sql_trans_find_type(tr, s, id); sys_drop_type(tr, t, drop_action); - os_del(s->types, tr, t->base.name, &t->base); + os_del(s->types, tr, t->base.name, dup_base(&t->base)); return 1; } @@ -4254,7 +4254,7 @@ sql_trans_drop_func(sql_trans *tr, sql_s } sys_drop_func(tr, func, DROP_CASCADE); - os_del(s->funcs, tr, func->base.name, &func->base); + os_del(s->funcs, tr, func->base.name, dup_base(&func->base)); if (drop_action == DROP_CASCADE_START && tr->dropped) { list_destroy(tr->dropped); @@ -4271,7 +4271,7 @@ build_drop_func_list_item(sql_trans *tr, if (b) { sql_func *func = (sql_func*)b; sys_drop_func(tr, func, DROP_CASCADE); - os_del(s->funcs, tr, func->base.name, &func->base); + os_del(s->funcs, tr, func->base.name, dup_base(&func->base)); } } @@ -4426,7 +4426,7 @@ sql_trans_drop_schema(sql_trans *tr, sql sql_trans_drop_any_comment(tr, s->base.id); sql_trans_drop_obj_priv(tr, s->base.id); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list