From: Luca Boccassi Date: Sun, 10 Sep 2023 21:52:05 +0000 (+0100) Subject: core: dump jobs list on sigrtmin+18 with 0x500 X-Git-Tag: v255-rc1~531^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0112c37ce457db3cc0ffc16aeef6a67522fc7797;p=thirdparty%2Fsystemd.git core: dump jobs list on sigrtmin+18 with 0x500 --- diff --git a/src/core/manager-dump.c b/src/core/manager-dump.c index 4575a291e3b..6c32d78f3f9 100644 --- a/src/core/manager-dump.c +++ b/src/core/manager-dump.c @@ -24,6 +24,22 @@ void manager_dump_jobs(Manager *s, FILE *f, char **patterns, const char *prefix) } } +int manager_get_dump_jobs_string(Manager *m, char **patterns, const char *prefix, char **ret) { + _cleanup_(memstream_done) MemStream ms = {}; + FILE *f; + + assert(m); + assert(ret); + + f = memstream_init(&ms); + if (!f) + return -errno; + + manager_dump_jobs(m, f, patterns, prefix); + + return memstream_finalize(&ms, ret, NULL); +} + void manager_dump_units(Manager *s, FILE *f, char **patterns, const char *prefix) { Unit *u; const char *t; diff --git a/src/core/manager-dump.h b/src/core/manager-dump.h index 714a1f0c8ef..5b96f26f543 100644 --- a/src/core/manager-dump.h +++ b/src/core/manager-dump.h @@ -6,6 +6,7 @@ #include "manager.h" void manager_dump_jobs(Manager *s, FILE *f, char **patterns, const char *prefix); +int manager_get_dump_jobs_string(Manager *m, char **patterns, const char *prefix, char **ret); void manager_dump_units(Manager *s, FILE *f, char **patterns, const char *prefix); void manager_dump(Manager *s, FILE *f, char **patterns, const char *prefix); int manager_get_dump_string(Manager *m, char **patterns, char **ret); diff --git a/src/core/manager.c b/src/core/manager.c index 3bd27cba9ce..07845af6d17 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -3030,6 +3030,19 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t manager_override_log_target(m, LOG_TARGET_NULL); break; + case MANAGER_SIGNAL_COMMAND_DUMP_JOBS: { + _cleanup_free_ char *dump_jobs = NULL; + + r = manager_get_dump_jobs_string(m, /* patterns= */ NULL, " ", &dump_jobs); + if (r < 0) { + log_warning_errno(errno, "Failed to acquire manager jobs dump: %m"); + break; + } + + log_dump(LOG_INFO, dump_jobs); + break; + } + default: generic = true; } diff --git a/src/core/manager.h b/src/core/manager.h index 354af5a8be3..ee2ace70a81 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -8,6 +8,7 @@ #include "sd-device.h" #include "sd-event.h" +#include "common-signal.h" #include "cgroup-util.h" #include "cgroup.h" #include "fdset.h" @@ -23,6 +24,14 @@ typedef struct Unit Unit; /* Enforce upper limit how many names we allow */ #define MANAGER_MAX_NAMES 131072 /* 128K */ +/* On sigrtmin+18, private commands */ +enum { + MANAGER_SIGNAL_COMMAND_DUMP_JOBS = _COMMON_SIGNAL_COMMAND_PRIVATE_BASE + 0, + _MANAGER_SIGNAL_COMMAND_MAX, +}; + +assert_cc((int) _MANAGER_SIGNAL_COMMAND_MAX <= (int) _COMMON_SIGNAL_COMMAND_PRIVATE_END); + typedef struct Manager Manager; /* An externally visible state. We don't actually maintain this as state variable, but derive it from various fields diff --git a/src/shared/common-signal.h b/src/shared/common-signal.h index 7d2ab28f519..1fe7b7623a4 100644 --- a/src/shared/common-signal.h +++ b/src/shared/common-signal.h @@ -1,4 +1,5 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once #include @@ -48,6 +49,10 @@ enum { COMMON_SIGNAL_COMMAND_MEMORY_PRESSURE = 0x300, COMMON_SIGNAL_COMMAND_MALLOC_INFO, + + /* Private signals start at 0x500 */ + _COMMON_SIGNAL_COMMAND_PRIVATE_BASE = 0x500, + _COMMON_SIGNAL_COMMAND_PRIVATE_END = 0xfff, }; struct sigrtmin18_info {