diff --git a/src/core/varlink.c b/src/core/varlink.c index 22312a11f7..17f5ac4fad 100644 --- a/src/core/varlink.c +++ b/src/core/varlink.c @@ -69,16 +69,18 @@ static int build_managed_oom_json_array_element(Unit *u, const char *property, s SD_JSON_BUILD_PAIR_CONDITION(use_duration, "duration", SD_JSON_BUILD_UNSIGNED(c->moom_mem_pressure_duration_usec))); } -static int build_managed_oom_cgroups_json(Manager *m, sd_json_variant **ret) { - _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL, *arr = NULL; +static int build_managed_oom_cgroups_json(Manager *m, bool allow_empty, sd_json_variant **ret) { + _cleanup_(sd_json_variant_unrefp) sd_json_variant *arr = NULL; int r; assert(m); assert(ret); - r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); - if (r < 0) - return r; + if (allow_empty) { + r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); + if (r < 0) + return r; + } for (UnitType t = 0; t < _UNIT_TYPE_MAX; t++) { @@ -119,12 +121,17 @@ static int build_managed_oom_cgroups_json(Manager *m, sd_json_variant **ret) { } } - r = sd_json_buildo(&v, SD_JSON_BUILD_PAIR("cgroups", SD_JSON_BUILD_VARIANT(arr))); + if (!arr) { + assert(!allow_empty); + *ret = NULL; + return 0; + } + + r = sd_json_buildo(ret, SD_JSON_BUILD_PAIR("cgroups", SD_JSON_BUILD_VARIANT(arr))); if (r < 0) return r; - *ret = TAKE_PTR(v); - return 0; + return 1; } static int manager_varlink_send_managed_oom_initial(Manager *m) { @@ -141,8 +148,8 @@ static int manager_varlink_send_managed_oom_initial(Manager *m) { assert(m->managed_oom_varlink); - r = build_managed_oom_cgroups_json(m, &v); - if (r < 0) + r = build_managed_oom_cgroups_json(m, /* allow_empty = */ false, &v); + if (r <= 0) return r; return sd_varlink_send(m->managed_oom_varlink, "io.systemd.oom.ReportManagedOOMCGroups", v); @@ -251,9 +258,11 @@ int manager_varlink_send_managed_oom_update(Unit *u) { if (!c) return 0; - r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); - if (r < 0) - return r; + if (MANAGER_IS_SYSTEM(u->manager)) { + r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); + if (r < 0) + return r; + } FOREACH_ELEMENT(i, managed_oom_mode_properties) { _cleanup_(sd_json_variant_unrefp) sd_json_variant *e = NULL; @@ -267,6 +276,12 @@ int manager_varlink_send_managed_oom_update(Unit *u) { return r; } + if (!arr) { + /* There is nothing updated. Skip calling method. */ + assert(!MANAGER_IS_SYSTEM(u->manager)); + return 0; + } + r = sd_json_buildo(&v, SD_JSON_BUILD_PAIR("cgroups", SD_JSON_BUILD_VARIANT(arr))); if (r < 0) return r; @@ -320,7 +335,7 @@ static int vl_method_subscribe_managed_oom_cgroups( _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL; - r = build_managed_oom_cgroups_json(m, &v); + r = build_managed_oom_cgroups_json(m, /* allow_empty = */ true, &v); if (r < 0) return r;