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

Reply via email to