summaryrefslogtreecommitdiff
path: root/src/basic/hashmap.c
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2015-06-18 11:31:10 +0200
committerTom Gundersen <teg@jklm.no>2015-06-18 21:35:18 +0200
commit4f1b306169c2651f20a20befd18926677a272d8f (patch)
tree63eb77eb733d288d10c7aef9742a96445b1918f2 /src/basic/hashmap.c
parentfd23f9c9a70e1214507641d327da40d1688b74d7 (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/hashmap.c')
-rw-r--r--src/basic/hashmap.c8
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)