Commit b3799630 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

dbghelp: Improve speed of our hashtable implementation by remembering the last…

dbghelp: Improve speed of our hashtable implementation by remembering the last element added to every bucket.
parent 2d7ccb38
......@@ -80,11 +80,17 @@ struct hash_table_elt
struct hash_table_elt* next;
};
struct hash_table_bucket
{
struct hash_table_elt* first;
struct hash_table_elt* last;
};
struct hash_table
{
unsigned num_elts;
unsigned num_buckets;
struct hash_table_elt** buckets;
struct hash_table_bucket* buckets;
struct pool* pool;
};
......
......@@ -378,20 +378,26 @@ void hash_table_destroy(struct hash_table* ht)
void hash_table_add(struct hash_table* ht, struct hash_table_elt* elt)
{
unsigned hash = hash_table_hash(elt->name, ht->num_buckets);
struct hash_table_elt** p;
if (!ht->buckets)
{
ht->buckets = pool_alloc(ht->pool, ht->num_buckets * sizeof(struct hash_table_elt*));
ht->buckets = pool_alloc(ht->pool, ht->num_buckets * sizeof(struct hash_table_bucket));
assert(ht->buckets);
memset(ht->buckets, 0, ht->num_buckets * sizeof(struct hash_table_elt*));
memset(ht->buckets, 0, ht->num_buckets * sizeof(struct hash_table_bucket));
}
/* in some cases, we need to get back the symbols of same name in the order
* in which they've been inserted. So insert new elements at the end of the list.
*/
for (p = &ht->buckets[hash]; *p; p = &((*p)->next));
*p = elt;
if (!ht->buckets[hash].first)
{
ht->buckets[hash].first = elt;
}
else
{
ht->buckets[hash].last->next = elt;
}
ht->buckets[hash].last = elt;
elt->next = NULL;
ht->num_elts++;
}
......@@ -415,10 +421,10 @@ void hash_table_iter_init(const struct hash_table* ht,
void* hash_table_iter_up(struct hash_table_iter* hti)
{
if(!hti->ht->buckets) return NULL;
if (!hti->ht->buckets) return NULL;
if (hti->element) hti->element = hti->element->next;
while (!hti->element && hti->index < hti->last)
hti->element = hti->ht->buckets[++hti->index];
hti->element = hti->ht->buckets[++hti->index].first;
return hti->element;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment