chiark / gitweb /
core: add a setting to globally control the default for timer unit accuracy
[elogind.git] / src / core / manager.h
index a46b09eddd8af068922208aaf805291055186758..14cdf81512878c6cdafdbd3040796ef58d7a8c70 100644 (file)
 
 typedef struct Manager Manager;
 
-typedef enum ManagerExitCode {
+typedef enum ManagerState {
+        MANAGER_STARTING,
         MANAGER_RUNNING,
+        MANAGER_DEGRADED,
+        MANAGER_MAINTENANCE,
+        MANAGER_STOPPING,
+        _MANAGER_STATE_MAX,
+        _MANAGER_STATE_INVALID = -1
+} ManagerState;
+
+typedef enum ManagerExitCode {
+        MANAGER_OK,
         MANAGER_EXIT,
         MANAGER_RELOAD,
         MANAGER_REEXECUTE,
@@ -57,6 +67,8 @@ typedef enum ManagerExitCode {
 #include "path-lookup.h"
 #include "execute.h"
 #include "unit-name.h"
+#include "exit-status.h"
+#include "show-status.h"
 
 struct Manager {
         /* Note that the set of units we know of is allowed to be
@@ -95,7 +107,17 @@ 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 */
+
+        /* A set which contains all currently failed units */
+        Set *failed_units;
 
         sd_event_source *run_queue_event_source;
 
@@ -138,8 +160,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,15 +174,20 @@ struct Manager {
         /* Data specific to the swap filesystem */
         FILE *proc_swaps;
         sd_event_source *swap_event_source;
-        Hashmap *swaps_by_proc_swaps;
-        bool request_reload;
+        Hashmap *swaps_by_devnode;
 
         /* Data specific to the D-Bus subsystem */
         sd_bus *api_bus, *system_bus;
         Set *private_buses;
         int private_listen_fd;
         sd_event_source *private_listen_event_source;
-        Set *subscribed;
+
+        /* Contains all the clients that are subscribed to signals via
+        the API bus. Note that private bus connections are always
+        considered subscribes, since they last for very short only,
+        and it is much simpler that way. */
+        sd_bus_track *subscribed;
+        char **deserialized_subscribed;
 
         sd_bus_message *queued_message; /* This is used during reloading:
                                       * before the reload we queue the
@@ -198,19 +226,24 @@ struct Manager {
 
         bool taint_usr:1;
 
-        bool show_status;
+        ShowStatus show_status;
         bool confirm_spawn;
         bool no_console_output;
 
         ExecOutput default_std_output, default_std_error;
 
-        usec_t default_restart_usec, default_timeout_start_usec,
-                default_timeout_stop_usec;
+        usec_t default_restart_usec, default_timeout_start_usec, default_timeout_stop_usec;
 
         usec_t default_start_limit_interval;
         unsigned default_start_limit_burst;
 
-        struct rlimit *rlimit[RLIMIT_NLIMITS];
+        bool default_cpu_accounting;
+        bool default_memory_accounting;
+        bool default_blockio_accounting;
+
+        usec_t default_timer_accuracy_usec;
+
+        struct rlimit *rlimit[_RLIMIT_MAX];
 
         /* non-zero if we are reloading or reexecuting, */
         int n_reloading;
@@ -234,9 +267,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);
@@ -293,7 +329,15 @@ 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);
+
+const char *manager_get_runtime_prefix(Manager *m);
+
+ManagerState manager_state(Manager *m);
+
+const char *manager_state_to_string(ManagerState m) _const_;
+ManagerState manager_state_from_string(const char *s) _pure_;