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,
#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
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;
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;
/* 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;
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
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_cpu_quota_period_usec;
+
+ usec_t default_timer_accuracy_usec;
+
+ struct rlimit *rlimit[_RLIMIT_MAX];
/* non-zero if we are reloading or reexecuting, */
int n_reloading;
* 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);
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_;