X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fhashmap.c;h=4ea1a0f4cb9d010dcbda92b3aa09c65de4af74ea;hb=7991ac34ab08421415b907e42775c5539a4a5bbb;hp=dcfbb67228e826b21260d4d995ca6ed3a5494bfb;hpb=a4bcff5ba36115495994e9f9ba66074471de76ab;p=elogind.git diff --git a/src/shared/hashmap.c b/src/shared/hashmap.c index dcfbb6722..4ea1a0f4c 100644 --- a/src/shared/hashmap.c +++ b/src/shared/hashmap.c @@ -103,7 +103,7 @@ static void deallocate_tile(void **first_tile, void *p) { *first_tile = p; } -#ifndef __OPTIMIZE__ +#ifdef VALGRIND static void drop_pool(struct pool *p) { while (p) { @@ -309,6 +309,17 @@ void hashmap_free_free(Hashmap *h) { hashmap_free(h); } +void hashmap_free_free_free(Hashmap *h) { + + /* Free the hashmap and all data and key objects in it */ + + if (!h) + return; + + hashmap_clear_free_free(h); + hashmap_free(h); +} + void hashmap_clear(Hashmap *h) { if (!h) return; @@ -327,6 +338,22 @@ void hashmap_clear_free(Hashmap *h) { free(p); } +void hashmap_clear_free_free(Hashmap *h) { + if (!h) + return; + + while (h->iterate_list_head) { + void *a, *b; + + a = h->iterate_list_head->value; + b = (void*) h->iterate_list_head->key; + remove_entry(h, h->iterate_list_head); + free(a); + free(b); + } +} + + static struct hashmap_entry *hash_scan(Hashmap *h, unsigned hash, const void *key) { struct hashmap_entry *e; assert(h); @@ -346,13 +373,10 @@ int hashmap_put(Hashmap *h, const void *key, void *value) { assert(h); hash = h->hash_func(key) % NBUCKETS; - e = hash_scan(h, hash, key); if (e) { - if (e->value == value) return 0; - return -EEXIST; } @@ -507,7 +531,6 @@ int hashmap_remove_and_replace(Hashmap *h, const void *old_key, const void *new_ return -ENOENT; new_hash = h->hash_func(new_key) % NBUCKETS; - if ((k = hash_scan(h, new_hash, new_key))) if (e != k) remove_entry(h, k);