From 6b9f63cb3fdbc8e365aa55bef219ced91c10c103 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 12 Jun 2023 16:37:37 +0200 Subject: [PATCH] json: add json_dispatch_variant_noref() helper This is identical to json_dispatch_variant() but doesn't increase the ref counter of the variant. This is useful for taking JSON objects apart locally without the intention to keep any component pinned for longer than the local stack frame. --- src/shared/json.c | 10 ++++++++++ src/shared/json.h | 1 + 2 files changed, 11 insertions(+) diff --git a/src/shared/json.c b/src/shared/json.c index 26d99a5fba0..417d17df347 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -4642,10 +4642,20 @@ int json_dispatch_variant(const char *name, JsonVariant *variant, JsonDispatchFl JsonVariant **p = ASSERT_PTR(userdata); assert(variant); + /* Takes a reference */ JSON_VARIANT_REPLACE(*p, json_variant_ref(variant)); return 0; } +int json_dispatch_variant_noref(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) { + JsonVariant **p = ASSERT_PTR(userdata); + assert(variant); + + /* Doesn't take a reference */ + *p = variant; + return 0; +} + int json_dispatch_uid_gid(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) { uid_t *uid = userdata; uint64_t k; diff --git a/src/shared/json.h b/src/shared/json.h index 5d79472351f..1356d0827bd 100644 --- a/src/shared/json.h +++ b/src/shared/json.h @@ -387,6 +387,7 @@ int json_dispatch_strv(const char *name, JsonVariant *variant, JsonDispatchFlags int json_dispatch_boolean(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); int json_dispatch_tristate(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); int json_dispatch_variant(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); +int json_dispatch_variant_noref(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); int json_dispatch_int64(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); int json_dispatch_uint64(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); int json_dispatch_uint32(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata); -- 2.47.3