1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-23 17:34:00 +03:00

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.
This commit is contained in:
Tom Gundersen 2015-06-18 11:31:10 +02:00
parent fd23f9c9a7
commit 4f1b306169

View File

@ -22,6 +22,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <errno.h> #include <errno.h>
#include <pthread.h>
#include "util.h" #include "util.h"
#include "hashmap.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 */ /* 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 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; #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 #ifdef ENABLE_DEBUG_HASHMAP
LIST_PREPEND(debug_list, hashmap_debug_list, &h->debug);
h->debug.func = func; h->debug.func = func;
h->debug.file = file; h->debug.file = file;
h->debug.line = line; 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 #endif
return h; return h;
@ -861,7 +865,9 @@ static void hashmap_free_no_clear(HashmapBase *h) {
assert(!h->n_direct_entries); assert(!h->n_direct_entries);
#ifdef ENABLE_DEBUG_HASHMAP #ifdef ENABLE_DEBUG_HASHMAP
assert_se(pthread_mutex_lock(&hashmap_debug_list_mutex) == 0);
LIST_REMOVE(debug_list, hashmap_debug_list, &h->debug); LIST_REMOVE(debug_list, hashmap_debug_list, &h->debug);
assert_se(pthread_mutex_unlock(&hashmap_debug_list_mutex) == 0);
#endif #endif
if (h->from_pool) if (h->from_pool)