]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
hashmap: add an environment variable to turn off the memory pool used by hashmaps
authorLennart Poettering <lennart@poettering.net>
Fri, 3 Aug 2018 14:45:21 +0000 (16:45 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 3 Aug 2018 15:36:11 +0000 (17:36 +0200)
Triggered by https://bugzilla.redhat.com/show_bug.cgi?id=1609349

doc/ENVIRONMENT.md
src/basic/hashmap.c

index c69bf9b66467c234948f504792025ac34ec3c1b1..9d598a6693189c2c1aa286de7ec44c0d57bcb688 100644 (file)
@@ -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
index 69a7d70b04be13dcd4d9dd678e05d16bf13dda8e..65e22ccd21feda6c60845c8a759b3a895a22e168 100644 (file)
@@ -6,8 +6,9 @@
 #include <string.h>
 
 #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) {