diff options
Diffstat (limited to 'src/common/container.c')
-rw-r--r-- | src/common/container.c | 49 |
1 files changed, 22 insertions, 27 deletions
diff --git a/src/common/container.c b/src/common/container.c index c31a4d2713..a148af2663 100644 --- a/src/common/container.c +++ b/src/common/container.c @@ -769,8 +769,6 @@ digestmap_set(digestmap_t *map, const char *key, void *val) { #ifndef OPTIMIZED_DIGESTMAP_SET digestmap_entry_t *resolve; -#else - digestmap_entry_t **resolve_ptr; #endif digestmap_entry_t search; void *oldval; @@ -792,31 +790,28 @@ digestmap_set(digestmap_t *map, const char *key, void *val) return NULL; } #else - /* XXXX020 We spend up to 5% of our time in this function, so the code - * below is meant to optimize the check/alloc/set cycle by avoiding the - * two trips to the hash table that we do in the unoptimized code above. - * (Each of HT_INSERT and HT_FIND calls HT_SET_HASH and HT_FIND_P.) - * - * Unfortunately, doing this requires us to poke around inside hash-table - * internals. It would be nice to avoid that. */ - if (!map->head.hth_table || - map->head.hth_n_entries >= map->head.hth_load_limit) - digestmap_impl_HT_GROW((&map->head), map->head.hth_n_entries+1); - _HT_SET_HASH(&search, node, digestmap_entry_hash); - resolve_ptr = _digestmap_impl_HT_FIND_P(&map->head, &search); - if (*resolve_ptr) { - oldval = (*resolve_ptr)->val; - (*resolve_ptr)->val = val; - return oldval; - } else { - digestmap_entry_t *newent = tor_malloc_zero(sizeof(digestmap_entry_t)); - memcpy(newent->key, key, DIGEST_LEN); - newent->val = val; - newent->node.hte_hash = search.node.hte_hash; - *resolve_ptr = newent; - ++map->head.hth_n_entries; - return NULL; - } + /* We spend up to 5% of our time in this function, so the code below is + * meant to optimize the check/alloc/set cycle by avoiding the two trips to + * the hash table that we do in the unoptimized code above. (Each of + * HT_INSERT and HT_FIND calls HT_SET_HASH and HT_FIND_P.) + */ + _HT_FIND_OR_INSERT(digestmap_impl, node, digestmap_entry_hash, &(map->head), + digestmap_entry_t, &search, ptr, + { + /* we found an entry. */ + oldval = (*ptr)->val; + (*ptr)->val = val; + return oldval; + }, + { + /* We didn't find the entry. */ + digestmap_entry_t *newent = + tor_malloc_zero(sizeof(digestmap_entry_t)); + memcpy(newent->key, key, DIGEST_LEN); + newent->val = val; + _HT_FOI_INSERT(node, &(map->head), &search, newent, ptr); + return NULL; + }); #endif } |