]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: dump jobs list on sigrtmin+18 with 0x500 29156/head
authorLuca Boccassi <bluca@debian.org>
Sun, 10 Sep 2023 21:52:05 +0000 (22:52 +0100)
committerLuca Boccassi <bluca@debian.org>
Mon, 11 Sep 2023 11:24:23 +0000 (12:24 +0100)
src/core/manager-dump.c
src/core/manager-dump.h
src/core/manager.c
src/core/manager.h
src/shared/common-signal.h

index 4575a291e3b0db34b16d512b277128e281021d67..6c32d78f3f9c560bb30c65e8b074e6aa7a5262ae 100644 (file)
@@ -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;
index 714a1f0c8ef0d2bd59570c2ee342e49b98ee81d3..5b96f26f543fad97ddefbdb02411d40b4ee8aed7 100644 (file)
@@ -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);
index 3bd27cba9ce191ef794fc793e9f4221ea6b9b78d..07845af6d17b9e5e889ca023c95bc89d3d1b4e9e 100644 (file)
@@ -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;
                                 }
index 354af5a8be362df1bb08349337919da872f469cd..ee2ace70a812d080e3979385868fbe048c9435a2 100644 (file)
@@ -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
index 7d2ab28f519fec2c487389ef40482cf84c072b8f..1fe7b7623a452b5b41c6f32c71cb6b1613355807 100644 (file)
@@ -1,4 +1,5 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
 
 #include <syslog.h>
 
@@ -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 {