Changeset: 4a64e8dbe306 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4a64e8dbe306 Modified Files: sql/common/sql_changeset.c sql/common/sql_hash.c sql/common/sql_list.c sql/common/sql_types.c sql/storage/sql_catalog.c sql/storage/store.c Branch: Jan2014 Log Message:
some objects were stored twice in the hash tables connected to the object lists. When an object got removed from the list an old reference could stay in the hash leading to crashes later. All the hash_add/del calls are now refactored into the list code. diffs (194 lines): diff --git a/sql/common/sql_changeset.c b/sql/common/sql_changeset.c --- a/sql/common/sql_changeset.c +++ b/sql/common/sql_changeset.c @@ -57,27 +57,17 @@ cs_add(changeset * cs, void *elm, int fl list_append(cs->set, elm); if (flag == TR_NEW && !cs->nelm) cs->nelm = cs->set->t; - MT_lock_set(&cs->set->ht_lock, "cs_add"); - if (cs->set->ht) - hash_add(cs->set->ht, base_key(elm), elm); - MT_lock_unset(&cs->set->ht_lock, "cs_add"); } void cs_add_before(changeset * cs, node *n, void *elm) { list_append_before(cs->set, n, elm); - MT_lock_set(&cs->set->ht_lock, "cs_add_before"); - if (cs->set->ht) - hash_add(cs->set->ht, base_key(elm), elm); - MT_lock_unset(&cs->set->ht_lock, "cs_add_before"); } void cs_del(changeset * cs, node *elm, int flag) { - void *val = elm->data; - if (flag == TR_NEW) { /* remove just added */ if (cs->nelm == elm) cs->nelm = elm->next; @@ -87,10 +77,6 @@ cs_del(changeset * cs, node *elm, int fl cs->dset = list_new(cs->sa, cs->destroy); list_move_data(cs->set, cs->dset, elm->data); } - MT_lock_set(&cs->set->ht_lock, "cs_del"); - if (cs->set->ht) - hash_del(cs->set->ht, base_key(val), val); - MT_lock_unset(&cs->set->ht_lock, "cs_del"); } int diff --git a/sql/common/sql_hash.c b/sql/common/sql_hash.c --- a/sql/common/sql_hash.c +++ b/sql/common/sql_hash.c @@ -47,11 +47,26 @@ hash_new(sql_allocator *sa, int size, fk return ht; } +static +int +not_done(sql_hash *h, int key, void *value) +{ + sql_hash_e *e = h->buckets[key&(h->size-1)]; + + while(e && e->value != value) { + e = e->chain; + } + if (e) + return 0; + return 1; +} + sql_hash_e* hash_add(sql_hash *h, int key, void *value) { sql_hash_e *e = SA_ZNEW(h->sa, sql_hash_e); + assert(not_done(h,key,value)); e->chain = h->buckets[key&(h->size-1)]; h->buckets[key&(h->size-1)] = e; e->key = key; diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c --- a/sql/common/sql_list.c +++ b/sql/common/sql_list.c @@ -108,15 +108,15 @@ void list_destroy(list *l) { if (l) { - node **n = &l->h; + node *n = l->h; MT_lock_destroy(&l->ht_lock); + l->h = NULL; if (l->destroy || l->sa == NULL) { - while (*n) { - node *t = *n; + while (n) { + node *t = n; - *n = NULL; - n = &t->next; + n = t->next; node_destroy(l, t); } } diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -1152,9 +1152,6 @@ sql_create_func_(sql_allocator *sa, char list_append(aggrs, t); } else { list_append(funcs, t); - MT_lock_set(&funcs->ht_lock, "sql_create_func_"); - hash_add(funcs->ht, base_key(&t->base), t); - MT_lock_unset(&funcs->ht_lock, "sql_create_func_"); } return t; } @@ -1180,9 +1177,6 @@ sql_create_sqlfunc(sql_allocator *sa, ch t->sql = 1; t->side_effect = FALSE; list_append(funcs, t); - MT_lock_set(&funcs->ht_lock, "sql_create_sqlfunc"); - hash_add(funcs->ht, base_key(&t->base), t); - MT_lock_unset(&funcs->ht_lock, "sql_create_sqlfunc"); return t; } diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c --- a/sql/storage/sql_catalog.c +++ b/sql/storage/sql_catalog.c @@ -293,7 +293,7 @@ find_all_sql_func(sql_schema * s, char * if (f->type == type && name[0] == b->name[0] && strcmp(name, b->name) == 0) { if (!res) res = list_create((fdestroy)NULL); - list_append(res, n->data); + list_append(res, f); } } } diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -2885,11 +2885,8 @@ reset_changeset(sql_trans *tr, changeset if (fs->nelm) { for (n = fs->nelm; n; ) { node *nxt = n->next; + list_remove_node(fs->set, n); - MT_lock_set(&fs->set->ht_lock, "reset_changeset"); - if(fs->set->ht) - hash_del(fs->set->ht, base_key(n->data), n->data); - MT_lock_unset(&fs->set->ht_lock, "reset_changeset"); n = nxt; } fs->nelm = NULL; @@ -2917,16 +2914,12 @@ reset_changeset(sql_trans *tr, changeset fprintf(stderr, "#reset_cs %s\n", (fb->name)?fb->name:"help"); } else if (fb->id < pfb->id) { node *t = n->next; + if (bs_debug) { sql_base *b = n->data; fprintf(stderr, "#reset_cs free %s\n", (b->name)?b->name:"help"); } list_remove_node(fs->set, n); - MT_lock_set(&fs->set->ht_lock, "reset_changeset"); - if(fs->set->ht) - hash_del(fs->set->ht, base_key(n->data), n->data); - MT_lock_unset(&fs->set->ht_lock, "reset_changeset"); - n = t; } else { /* a new id */ sql_base *r = fd(tr, TR_OLD, pfb, b); @@ -2951,16 +2944,13 @@ reset_changeset(sql_trans *tr, changeset } while ( ok == LOG_OK && n) { /* remove remaining old stuff */ node *t = n->next; + if (bs_debug) { sql_base *b = n->data; fprintf(stderr, "#reset_cs free %s\n", (b->name)?b->name:"help"); } list_remove_node(fs->set, n); - MT_lock_set(&fs->set->ht_lock, "reset_changeset"); - if(fs->set->ht) - hash_del(fs->set->ht, base_key(n->data), n->data); - MT_lock_unset(&fs->set->ht_lock, "reset_changeset"); n = t; } } @@ -3078,10 +3068,6 @@ reset_schema(sql_trans *tr, sql_schema * node *nxt = n->next; list_remove_node(fs->tables.set, n); - MT_lock_set(&fs->tables.set->ht_lock, "reset_schema"); - if(fs->tables.set->ht) - hash_del(fs->tables.set->ht, base_key(n->data), n->data); - MT_lock_unset(&fs->tables.set->ht_lock, "reset_schema"); n = nxt; } fs->tables.nelm = NULL; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list