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