diff options
author | Tom Gundersen <teg@jklm.no> | 2015-06-18 11:31:10 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2015-06-18 21:35:18 +0200 |
commit | 4f1b306169c2651f20a20befd18926677a272d8f (patch) | |
tree | 63eb77eb733d288d10c7aef9742a96445b1918f2 /src/basic | |
parent | fd23f9c9a70e1214507641d327da40d1688b74d7 (diff) |
hashmap: debug - lock access to the global hashmap list
This may be used from multi-threaded programs (say through nss-resolve),
so we must protect the global list.
This is still only relevant for debug builds, so we do not try to handle
cases where the locking fail, but simply assert.
Diffstat (limited to 'src/basic')
-rw-r--r-- | src/basic/hashmap.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/basic/hashmap.c b/src/basic/hashmap.c index 0ee2f3bd31..a84fc5b69e 100644 --- a/src/basic/hashmap.c +++ b/src/basic/hashmap.c @@ -22,6 +22,7 @@ #include <stdlib.h> #include <errno.h> +#include <pthread.h> #include "util.h" #include "hashmap.h" @@ -157,6 +158,7 @@ struct hashmap_debug_info { /* Tracks all existing hashmaps. Get at it from gdb. See sd_dump_hashmaps.py */ static LIST_HEAD(struct hashmap_debug_info, hashmap_debug_list); +static pthread_mutex_t hashmap_debug_list_mutex = PTHREAD_MUTEX_INITIALIZER; #define HASHMAP_DEBUG_FIELDS struct hashmap_debug_info debug; @@ -806,10 +808,12 @@ static struct HashmapBase *hashmap_base_new(const struct hash_ops *hash_ops, enu } #ifdef ENABLE_DEBUG_HASHMAP - LIST_PREPEND(debug_list, hashmap_debug_list, &h->debug); h->debug.func = func; h->debug.file = file; h->debug.line = line; + assert_se(pthread_mutex_lock(&hashmap_debug_list_mutex) == 0); + LIST_PREPEND(debug_list, hashmap_debug_list, &h->debug); + assert_se(pthread_mutex_unlock(&hashmap_debug_list_mutex) == 0); #endif return h; @@ -861,7 +865,9 @@ static void hashmap_free_no_clear(HashmapBase *h) { assert(!h->n_direct_entries); #ifdef ENABLE_DEBUG_HASHMAP + assert_se(pthread_mutex_lock(&hashmap_debug_list_mutex) == 0); LIST_REMOVE(debug_list, hashmap_debug_list, &h->debug); + assert_se(pthread_mutex_unlock(&hashmap_debug_list_mutex) == 0); #endif if (h->from_pool) |