Changeset: dcd7149c4884 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dcd7149c4884
Modified Files:
        sql/storage/objectset.c
Branch: nospare
Log Message:

Hash object_node instead of sql_base.


diffs (212 lines):

diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -93,7 +93,7 @@ node_destroy(objectset *os, object_node 
 static object_node *
 os_remove_node(objectset *os, object_node *n)
 {
-       void *data = n->data;
+       assert(n);
        object_node *p = os->h;
 
        if (p != n)
@@ -112,14 +112,14 @@ os_remove_node(objectset *os, object_nod
        }
        if (n == os->t)
                os->t = p;
-       if (data) {
-               MT_lock_set(&os->ht_lock);
-               if (os->id_map && data)
-                       hash_delete(os->id_map, data);
-               if (os->name_map && data)
-                       hash_delete(os->name_map, data);
-               MT_lock_unset(&os->ht_lock);
-       }
+
+       MT_lock_set(&os->ht_lock);
+       if (os->id_map && n)
+               hash_delete(os->id_map, n);
+       if (os->name_map && n)
+               hash_delete(os->name_map, n);
+       MT_lock_unset(&os->ht_lock);
+
        os->cnt--;
        assert(os->cnt > 0 || os->h == NULL);
 
@@ -154,17 +154,17 @@ os_append_node(objectset *os, object_nod
        if (n->data) {
                MT_lock_set(&os->ht_lock);
                if (os->name_map) {
-                       int key = os->name_map->key(n->data);
+                       int key = os->name_map->key(n);
 
-                       if (hash_add(os->name_map, key, n->data) == NULL) {
+                       if (hash_add(os->name_map, key, n) == NULL) {
                                MT_lock_unset(&os->ht_lock);
                                return NULL;
                        }
                }
                if (os->id_map) {
-                       int key = os->id_map->key(n->data);
+                       int key = os->id_map->key(n);
 
-                       if (hash_add(os->id_map, key, n->data) == NULL) {
+                       if (hash_add(os->id_map, key, n) == NULL) {
                                MT_lock_unset(&os->ht_lock);
                                return NULL;
                        }
@@ -302,51 +302,27 @@ os_destroy(objectset *os, sql_store stor
 }
 
 static int
-ov_key(objectversion *ov)
-{
-       return base_key(ov->obj);
-}
-
-static object_node *
-os_find(objectset *os, void *key, fcmp cmp)
+os_name_key(object_node *n)
 {
-       object_node *n = NULL;
-
-       if (key) {
-               if (cmp) {
-                       for (n = os->h; n; n = n->next) {
-                               if (cmp(n->data, key) == 0) {
-                                       return n;
-                               }
-                       }
-               } else {
-                       for (n = os->h; n; n = n->next) {
-                               if (n->data == key)
-                                       return n;
-                       }
-               }
-       }
-       return NULL;
+       return hash_key(n->data->obj->name);
 }
 
 static object_node *
 find_name(objectset *os, const char *name)
 {
-       object_node *n;
-
        if (os) {
                MT_lock_set(&os->ht_lock);
                if ((!os->name_map || os->name_map->size*16 < os->cnt) && 
os->cnt > HASH_MIN_SIZE && os->sa) {
-                       os->name_map = hash_new(os->sa, os->cnt, 
(fkeyvalue)&ov_key);
+                       os->name_map = hash_new(os->sa, os->cnt, 
(fkeyvalue)&os_name_key);
                        if (os->name_map == NULL) {
                                MT_lock_unset(&os->ht_lock);
                                return NULL;
                        }
 
-                       for (n = os->h; n; n = n->next ) {
-                               int key = ov_key(n->data);
+                       for (object_node *n = os->h; n; n = n->next ) {
+                               int key = os_name_key(n);
 
-                               if (hash_add(os->name_map, key, n->data) == 
NULL) {
+                               if (hash_add(os->name_map, key, n) == NULL) {
                                        MT_lock_unset(&os->ht_lock);
                                        return NULL;
                                }
@@ -357,18 +333,19 @@ find_name(objectset *os, const char *nam
                        sql_hash_e *he = 
os->name_map->buckets[key&(os->name_map->size-1)];
 
                        for (; he; he = he->chain) {
-                               objectversion *ov = he->value;
+                               object_node *n = he->value;
 
-                               if (ov && ov->obj->name && 
strcmp(ov->obj->name, name) == 0) {
+                               if (n && n->data->obj->name && 
strcmp(n->data->obj->name, name) == 0) {
                                        MT_lock_unset(&os->ht_lock);
-                                       return os_find(os, ov, NULL);
+                                       return n;
                                }
                        }
                        MT_lock_unset(&os->ht_lock);
                        return NULL;
                }
                MT_lock_unset(&os->ht_lock);
-               for (n = os->h; n; n = n->next) {
+               // TODO: can we actually reach this point?
+               for (object_node *n = os->h; n; n = n->next) {
                        objectversion *ov = n->data;
 
                        /* check if names match */
@@ -392,29 +369,28 @@ get_valid_object(sql_trans *tr, objectve
        return ov;
 }
 
+#if 0
 static void
-os_update_data(objectset *os, object_node *n, void *data)
+os_update_hash(objectset *os, object_node *n, /*new*/ objectversion *ov)
 {
        MT_lock_set(&os->ht_lock);
-
        if (os->name_map) {
-               hash_delete(os->name_map, n->data);
-               n->data = data;
-               int nkey = os->name_map->key(data);
-               hash_add(os->name_map, nkey, data);
+               hash_delete(os->name_map, n);
+               int nkey = os->name_map->key(ov);
+               hash_add(os->name_map, nkey, ov);
        }
 
        if (os->id_map) {
-               hash_delete(os->id_map, n->data);
-               n->data = data;
-               int nkey = os->id_map->key(data);
-               hash_add(os->id_map, nkey, data);
+               hash_delete(os->id_map, n);
+               int nkey = os->id_map->key(ov);
+               hash_add(os->id_map, nkey, ov);
        }
 
-       n->data = data;
+       n->data = ov;
 
        MT_lock_unset(&os->ht_lock);
 }
+#endif
 
 int /*ok, error (name existed) and conflict (added before) */
 os_add(objectset *os, struct sql_trans *tr, const char *name, sql_base *b)
@@ -440,10 +416,14 @@ os_add(objectset *os, struct sql_trans *
                        return -1;
                }
                ov->older = oo;
+
+               MT_lock_set(&os->ht_lock);
+               // TODO: double check/refine locking rationale
                if (oo)
                        oo->newer = ov;
-               os_update_data(os, n, ov);
+               n->data = ov;
                if (!os->temporary)
+               MT_lock_unset(&os->ht_lock);
                        trans_add(tr, b, ov, &tc_gc_objectversion, 
&tc_commit_objectversion);
                return 0;
        } else { /* new */
@@ -478,9 +458,15 @@ os_del(objectset *os, struct sql_trans *
                        return -1;
                }
                ov->older = oo;
+
+               MT_lock_set(&os->ht_lock);
+               // TODO: double check/refine locking rationale
                if (oo)
                        oo->newer = ov;
-               os_update_data(os, n, ov);
+               n->data = ov;
+               if (!os->temporary)
+               MT_lock_unset(&os->ht_lock);
+
                if (!os->temporary)
                        trans_add(tr, b, ov, &tc_gc_objectversion, 
&tc_commit_objectversion);
                return 0;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to