chiark / gitweb /
core: allow PIDs to be watched by two units at the same time
[elogind.git] / src / core / manager.h
index d6a6bce424ee992b9211c402c1bfa80408cf385d..948ea98a45ac178309037fdab35d819057294786 100644 (file)
@@ -57,6 +57,7 @@ typedef enum ManagerExitCode {
 #include "path-lookup.h"
 #include "execute.h"
 #include "unit-name.h"
+#include "exit-status.h"
 
 struct Manager {
         /* Note that the set of units we know of is allowed to be
@@ -95,7 +96,14 @@ struct Manager {
 
         sd_event *event;
 
-        Hashmap *watch_pids;  /* pid => Unit object n:1 */
+        /* We use two hash tables here, since the same PID might be
+         * watched by two different units: once the unit that forked
+         * it off, and possibly a different unit to which it was
+         * joined as cgroup member. Since we know that it is either
+         * one or two units for each PID we just use to hashmaps
+         * here. */
+        Hashmap *watch_pids1;  /* pid => Unit object n:1 */
+        Hashmap *watch_pids2;  /* pid => Unit object n:1 */
 
         sd_event_source *run_queue_event_source;
 
@@ -138,8 +146,9 @@ struct Manager {
         char *generator_unit_path_early;
         char *generator_unit_path_late;
 
-        /* Data specific to the device subsystem */
         struct udev* udev;
+
+        /* Data specific to the device subsystem */
         struct udev_monitor* udev_monitor;
         sd_event_source *udev_event_source;
         Hashmap *devices_by_sysfs;
@@ -151,7 +160,7 @@ struct Manager {
         /* Data specific to the swap filesystem */
         FILE *proc_swaps;
         sd_event_source *swap_event_source;
-        Hashmap *swaps_by_proc_swaps;
+        Hashmap *swaps_by_devnode;
 
         /* Data specific to the D-Bus subsystem */
         sd_bus *api_bus, *system_bus;
@@ -197,7 +206,7 @@ struct Manager {
 
         bool taint_usr:1;
 
-        bool show_status;
+        ShowStatus show_status;
         bool confirm_spawn;
         bool no_console_output;
 
@@ -233,9 +242,12 @@ struct Manager {
          * them. It's a hashmap with a path string as key and a Set as
          * value where Unit objects are contained. */
         Hashmap *units_requiring_mounts_for;
+
+        /* Reference to the kdbus bus control fd */
+        int kdbus_fd;
 };
 
-int manager_new(SystemdRunningAs running_as, bool reexecuting, Manager **m);
+int manager_new(SystemdRunningAs running_as, Manager **m);
 void manager_free(Manager *m);
 
 int manager_enumerate(Manager *m);
@@ -292,7 +304,8 @@ void manager_undo_generators(Manager *m);
 
 void manager_recheck_journal(Manager *m);
 
-void manager_set_show_status(Manager *m, bool b);
+void manager_set_show_status(Manager *m, ShowStatus mode);
 void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) _printf_(4,5);
+void manager_flip_auto_status(Manager *m, bool enable);
 
 Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path);