diff --git a/src/gallium/auxiliary/cso_cache/cso_hash.c b/src/gallium/auxiliary/cso_cache/cso_hash.c index e3495d5165a..e42f1feb9b5 100644 --- a/src/gallium/auxiliary/cso_cache/cso_hash.c +++ b/src/gallium/auxiliary/cso_cache/cso_hash.c @@ -73,22 +73,12 @@ static int countBits(int hint) return numBits; } -static void *cso_data_allocate_node(struct cso_hash_data *hash) -{ - return MALLOC(sizeof(struct cso_node)); -} - -static void cso_free_node(struct cso_node *node) -{ - FREE(node); -} - static struct cso_node * cso_hash_create_node(struct cso_hash *hash, - unsigned akey, void *avalue, - struct cso_node **anextNode) + unsigned akey, void *avalue, + struct cso_node **anextNode) { - struct cso_node *node = cso_data_allocate_node(hash->data.d); + struct cso_node *node = MALLOC(sizeof(struct cso_node)); if (!node) return NULL; @@ -96,7 +86,7 @@ cso_hash_create_node(struct cso_hash *hash, node->key = akey; node->value = avalue; - node->next = (struct cso_node*)(*anextNode); + node->next = *anextNode; *anextNode = node; ++hash->data.d->size; return node; @@ -116,7 +106,7 @@ static void cso_data_rehash(struct cso_hash_data *hash, int hint) } if (hash->numBits != hint) { - struct cso_node *e = (struct cso_node *)(hash); + struct cso_node *e = (struct cso_node *)hash; struct cso_node **oldBuckets = hash->buckets; int oldNumBuckets = hash->numBuckets; int i = 0; @@ -168,9 +158,10 @@ static void cso_data_has_shrunk(struct cso_hash_data *hash) static struct cso_node *cso_data_first_node(struct cso_hash_data *hash) { - struct cso_node *e = (struct cso_node *)(hash); + struct cso_node *e = (struct cso_node *)hash; struct cso_node **bucket = hash->buckets; int n = hash->numBuckets; + while (n--) { if (*bucket != e) return *bucket; @@ -180,23 +171,19 @@ static struct cso_node *cso_data_first_node(struct cso_hash_data *hash) } struct cso_hash_iter cso_hash_insert(struct cso_hash *hash, - unsigned key, void *data) + unsigned key, void *data) { cso_data_might_grow(hash->data.d); - { - struct cso_node **nextNode = cso_hash_find_node(hash, key); - struct cso_node *node = cso_hash_create_node(hash, key, data, nextNode); - if (!node) { - struct cso_hash_iter null_iter = {hash, 0}; - return null_iter; - } - - { - struct cso_hash_iter iter = {hash, node}; - return iter; - } + struct cso_node **nextNode = cso_hash_find_node(hash, key); + struct cso_node *node = cso_hash_create_node(hash, key, data, nextNode); + if (!node) { + struct cso_hash_iter null_iter = {hash, 0}; + return null_iter; } + + struct cso_hash_iter iter = {hash, node}; + return iter; } bool cso_hash_init(struct cso_hash *hash) @@ -216,14 +203,15 @@ bool cso_hash_init(struct cso_hash *hash) void cso_hash_deinit(struct cso_hash *hash) { - struct cso_node *e_for_x = (struct cso_node *)(hash->data.d); - struct cso_node **bucket = (struct cso_node **)(hash->data.d->buckets); + struct cso_node *e_for_x = (struct cso_node *)hash->data.d; + struct cso_node **bucket = hash->data.d->buckets; int n = hash->data.d->numBuckets; + while (n--) { struct cso_node *cur = *bucket++; while (cur != e_for_x) { struct cso_node *next = cur->next; - cso_free_node(cur); + FREE(cur); cur = next; } } @@ -253,7 +241,7 @@ struct cso_node *cso_hash_data_next(struct cso_node *node) a.next = node->next; if (!a.next) { debug_printf("iterating beyond the last element\n"); - return 0; + return NULL; } if (a.next->next) return a.next; @@ -307,26 +295,26 @@ static struct cso_node *cso_hash_data_prev(struct cso_node *node) return a.e; } -void * cso_hash_take(struct cso_hash *hash, - unsigned akey) +void *cso_hash_take(struct cso_hash *hash, unsigned akey) { struct cso_node **node = cso_hash_find_node(hash, akey); + if (*node != hash->data.e) { void *t = (*node)->value; struct cso_node *next = (*node)->next; - cso_free_node(*node); + FREE(*node); *node = next; --hash->data.d->size; cso_data_has_shrunk(hash->data.d); return t; } - return 0; + return NULL; } struct cso_hash_iter cso_hash_iter_prev(struct cso_hash_iter iter) { struct cso_hash_iter prev = {iter.hash, - cso_hash_data_prev(iter.node)}; + cso_hash_data_prev(iter.node)}; return prev; } @@ -351,17 +339,17 @@ struct cso_hash_iter cso_hash_erase(struct cso_hash *hash, struct cso_hash_iter return iter; ret = cso_hash_iter_next(ret); - node_ptr = (struct cso_node**)(&hash->data.d->buckets[node->key % hash->data.d->numBuckets]); + node_ptr = &hash->data.d->buckets[node->key % hash->data.d->numBuckets]; while (*node_ptr != node) node_ptr = &(*node_ptr)->next; *node_ptr = node->next; - cso_free_node(node); + FREE(node); --hash->data.d->size; return ret; } -boolean cso_hash_contains(struct cso_hash *hash, unsigned key) +bool cso_hash_contains(struct cso_hash *hash, unsigned key) { struct cso_node **node = cso_hash_find_node(hash, key); - return (*node != hash->data.e); + return *node != hash->data.e; } diff --git a/src/gallium/auxiliary/cso_cache/cso_hash.h b/src/gallium/auxiliary/cso_cache/cso_hash.h index 182cef0a2af..23cf5c8254e 100644 --- a/src/gallium/auxiliary/cso_cache/cso_hash.h +++ b/src/gallium/auxiliary/cso_cache/cso_hash.h @@ -82,7 +82,7 @@ bool cso_hash_init(struct cso_hash *hash); void cso_hash_deinit(struct cso_hash *hash); -int cso_hash_size(struct cso_hash *hash); +int cso_hash_size(struct cso_hash *hash); /** @@ -102,7 +102,7 @@ struct cso_hash_iter cso_hash_insert(struct cso_hash *hash, unsigned key, */ struct cso_hash_iter cso_hash_erase(struct cso_hash *hash, struct cso_hash_iter iter); -void *cso_hash_take(struct cso_hash *hash, unsigned key); +void *cso_hash_take(struct cso_hash *hash, unsigned key); @@ -111,10 +111,10 @@ struct cso_hash_iter cso_hash_first_node(struct cso_hash *hash); /** * Returns true if a value with the given key exists in the hash */ -boolean cso_hash_contains(struct cso_hash *hash, unsigned key); +bool cso_hash_contains(struct cso_hash *hash, unsigned key); -unsigned cso_hash_iter_key(struct cso_hash_iter iter); +unsigned cso_hash_iter_key(struct cso_hash_iter iter); struct cso_hash_iter cso_hash_iter_prev(struct cso_hash_iter iter); @@ -125,26 +125,24 @@ struct cso_hash_iter cso_hash_iter_prev(struct cso_hash_iter iter); * comparison to see which entry in the list is a direct copy of our template * and returns that entry. */ -void *cso_hash_find_data_from_template( struct cso_hash *hash, - unsigned hash_key, - void *templ, - int size ); +void *cso_hash_find_data_from_template(struct cso_hash *hash, + unsigned hash_key, + void *templ, + int size); struct cso_node *cso_hash_data_next(struct cso_node *node); -static inline int +static inline bool cso_hash_iter_is_null(struct cso_hash_iter iter) { - if (!iter.node || iter.node == iter.hash->data.e) - return 1; - return 0; + return !iter.node || iter.node == iter.hash->data.e; } static inline void * cso_hash_iter_data(struct cso_hash_iter iter) { if (!iter.node || iter.hash->data.e == iter.node) - return 0; + return NULL; return iter.node->value; } @@ -154,12 +152,12 @@ cso_hash_find_node(struct cso_hash *hash, unsigned akey) struct cso_node **node; if (hash->data.d->numBuckets) { - node = (struct cso_node **)(&hash->data.d->buckets[akey % hash->data.d->numBuckets]); + node = &hash->data.d->buckets[akey % hash->data.d->numBuckets]; assert(*node == hash->data.e || (*node)->next); while (*node != hash->data.e && (*node)->key != akey) node = &(*node)->next; } else { - node = (struct cso_node **)((const struct cso_node * const *)(&hash->data.e)); + node = &hash->data.e; } return node; }