From b4f607433cac749b617e15b3d5d122322ed2bc71 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 3 Aug 2018 16:45:21 +0200 Subject: [PATCH] hashmap: add an environment variable to turn off the memory pool used by hashmaps Triggered by https://bugzilla.redhat.com/show_bug.cgi?id=1609349 --- doc/ENVIRONMENT.md | 3 +++ src/basic/hashmap.c | 24 ++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/doc/ENVIRONMENT.md b/doc/ENVIRONMENT.md index c69bf9b6646..9d598a66931 100644 --- a/doc/ENVIRONMENT.md +++ b/doc/ENVIRONMENT.md @@ -42,6 +42,9 @@ All tools: are understood, too (us, ms, s, min, h, d, w, month, y). If it is not set or set to 0, then the built-in default is used. +* `$SYSTEMD_MEMPOOL=0` — if set the internal memory caching logic employed by + hash tables is turned off, and libc malloc() is used for all allocations. + systemctl: * `$SYSTEMCTL_FORCE_BUS=1` — if set, do not connect to PID1's private D-Bus diff --git a/src/basic/hashmap.c b/src/basic/hashmap.c index 69a7d70b04b..65e22ccd21f 100644 --- a/src/basic/hashmap.c +++ b/src/basic/hashmap.c @@ -6,8 +6,9 @@ #include #include "alloc-util.h" -#include "hashmap.h" +#include "env-util.h" #include "fileio.h" +#include "hashmap.h" #include "macro.h" #include "mempool.h" #include "process-util.h" @@ -766,20 +767,31 @@ static void reset_direct_storage(HashmapBase *h) { memset(p, DIB_RAW_INIT, sizeof(dib_raw_t) * hi->n_direct_buckets); } +static bool use_pool(void) { + static int b = -1; + + if (!is_main_thread()) + return false; + + if (b < 0) + b = getenv_bool("SYSTEMD_MEMPOOL") != 0; + + return b; +} + static struct HashmapBase *hashmap_base_new(const struct hash_ops *hash_ops, enum HashmapType type HASHMAP_DEBUG_PARAMS) { HashmapBase *h; const struct hashmap_type_info *hi = &hashmap_type_info[type]; - bool use_pool; - - use_pool = is_main_thread(); + bool up; - h = use_pool ? mempool_alloc0_tile(hi->mempool) : malloc0(hi->head_size); + up = use_pool(); + h = up ? mempool_alloc0_tile(hi->mempool) : malloc0(hi->head_size); if (!h) return NULL; h->type = type; - h->from_pool = use_pool; + h->from_pool = up; h->hash_ops = hash_ops ? hash_ops : &trivial_hash_ops; if (type == HASHMAP_TYPE_ORDERED) { -- 2.39.2