mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-24 21:34:08 +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:
parent
fd23f9c9a7
commit
4f1b306169
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user