]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/job.h
unit: unit type dependent status messages
[thirdparty/systemd.git] / src / core / job.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
60918275
LP
2
3#ifndef foojobhfoo
4#define foojobhfoo
5
a7334b09
LP
6/***
7 This file is part of systemd.
8
9 Copyright 2010 Lennart Poettering
10
11 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
12 under the terms of the GNU Lesser General Public License as published by
13 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
14 (at your option) any later version.
15
16 systemd is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 19 Lesser General Public License for more details.
a7334b09 20
5430f7f2 21 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
22 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23***/
24
60918275
LP
25#include <stdbool.h>
26#include <inttypes.h>
348e27fe 27#include <errno.h>
60918275
LP
28
29typedef struct Job Job;
e5b5ae50 30typedef struct JobDependency JobDependency;
97e6a119 31typedef struct JobBusClient JobBusClient;
60918275 32typedef enum JobType JobType;
e5b5ae50 33typedef enum JobState JobState;
5cb5a6ff 34typedef enum JobMode JobMode;
5d44db4a 35typedef enum JobResult JobResult;
60918275 36
348e27fe 37/* Be careful when changing the job types! Adjust job_merging_table[] accordingly! */
60918275 38enum JobType {
87f0e418 39 JOB_START, /* if a unit does not support being started, we'll just wait until it becomes active */
5cb5a6ff
LP
40 JOB_VERIFY_ACTIVE,
41
60918275 42 JOB_STOP,
5cb5a6ff 43
e0209d83 44 JOB_RELOAD, /* if running, reload */
5cb5a6ff
LP
45
46 /* Note that restarts are first treated like JOB_STOP, but
47 * then instead of finishing are patched to become
48 * JOB_START. */
e0209d83
MS
49 JOB_RESTART, /* If running, stop. Then start unconditionally. */
50
51 _JOB_TYPE_MAX_MERGING,
52
53 /* JOB_NOP can enter into a transaction, but as it won't pull in
54 * any dependencies, it won't have to merge with anything.
55 * job_install() avoids the problem of merging JOB_NOP too (it's
56 * special-cased, only merges with other JOB_NOPs). */
57 JOB_NOP = _JOB_TYPE_MAX_MERGING, /* do nothing */
58
59 _JOB_TYPE_MAX_IN_TRANSACTION,
60
61 /* JOB_TRY_RESTART can never appear in a transaction, because
62 * it always collapses into JOB_RESTART or JOB_NOP before entering.
63 * Thus we never need to merge it with anything. */
64 JOB_TRY_RESTART = _JOB_TYPE_MAX_IN_TRANSACTION, /* if running, stop and then start */
65
66 /* JOB_RELOAD_OR_START won't enter into a transaction and cannot result
67 * from transaction merging (there's no way for JOB_RELOAD and
68 * JOB_START to meet in one transaction). It can result from a merge
69 * during job installation, but then it will immediately collapse into
70 * one of the two simpler types. */
71 JOB_RELOAD_OR_START, /* if running, reload, otherwise start */
5cb5a6ff 72
e5b5ae50
LP
73 _JOB_TYPE_MAX,
74 _JOB_TYPE_INVALID = -1
60918275
LP
75};
76
e5b5ae50 77enum JobState {
60918275
LP
78 JOB_WAITING,
79 JOB_RUNNING,
94f04347
LP
80 _JOB_STATE_MAX,
81 _JOB_STATE_INVALID = -1
e5b5ae50 82};
60918275
LP
83
84enum JobMode {
cebe0d41
LP
85 JOB_FAIL, /* Fail if a conflicting job is already queued */
86 JOB_REPLACE, /* Replace an existing conflicting job */
87 JOB_ISOLATE, /* Start a unit, and stop all others */
88 JOB_IGNORE_DEPENDENCIES, /* Ignore both requirement and ordering dependencies */
89 JOB_IGNORE_REQUIREMENTS, /* Ignore requirement dependencies */
b548631a
LP
90 _JOB_MODE_MAX,
91 _JOB_MODE_INVALID = -1
60918275
LP
92};
93
5d44db4a
LP
94enum JobResult {
95 JOB_DONE,
96 JOB_CANCELED,
97 JOB_TIMEOUT,
98 JOB_FAILED,
99 JOB_DEPENDENCY,
d68201e9 100 JOB_SKIPPED,
5d44db4a
LP
101 _JOB_RESULT_MAX,
102 _JOB_RESULT_INVALID = -1
103};
104
c6918296
MS
105#include "manager.h"
106#include "unit.h"
107#include "hashmap.h"
108#include "list.h"
109
e5b5ae50
LP
110struct JobDependency {
111 /* Encodes that the 'subject' job needs the 'object' job in
112 * some way. This structure is used only while building a transaction. */
113 Job *subject;
114 Job *object;
115
034c6ed7
LP
116 LIST_FIELDS(JobDependency, subject);
117 LIST_FIELDS(JobDependency, object);
9d58f1db
LP
118
119 bool matters;
69dd2852 120 bool conflicts;
e5b5ae50
LP
121};
122
97e6a119
MS
123struct JobBusClient {
124 LIST_FIELDS(JobBusClient, client);
125 /* Note that this bus object is not ref counted here. */
126 DBusConnection *bus;
127 char name[0];
128};
129
60918275
LP
130struct Job {
131 Manager *manager;
87f0e418 132 Unit *unit;
e5b5ae50 133
034c6ed7
LP
134 LIST_FIELDS(Job, transaction);
135 LIST_FIELDS(Job, run_queue);
c1e1601e 136 LIST_FIELDS(Job, dbus_queue);
e5b5ae50 137
44d8db9e
LP
138 LIST_HEAD(JobDependency, subject_list);
139 LIST_HEAD(JobDependency, object_list);
e5b5ae50 140
5cb5a6ff 141 /* Used for graph algs as a "I have been here" marker */
e5b5ae50
LP
142 Job* marker;
143 unsigned generation;
034c6ed7 144
9d58f1db
LP
145 uint32_t id;
146
147 JobType type;
148 JobState state;
149
faf919f1
LP
150 Watch timer_watch;
151
97e6a119
MS
152 /* There can be more than one client, because of job merging. */
153 LIST_HEAD(JobBusClient, bus_client_list);
a567261a 154
5d44db4a
LP
155 JobResult result;
156
9d58f1db
LP
157 bool installed:1;
158 bool in_run_queue:1;
159 bool matters_to_anchor:1;
160 bool override:1;
161 bool in_dbus_queue:1;
162 bool sent_dbus_new_signal:1;
cebe0d41 163 bool ignore_order:1;
39a18c60 164 bool forgot_bus_clients:1;
60918275
LP
165};
166
97e6a119
MS
167JobBusClient* job_bus_client_new(DBusConnection *connection, const char *name);
168
668ad332 169Job* job_new(Unit *unit, JobType type);
39a18c60 170Job* job_new_raw(Unit *unit);
60918275 171void job_free(Job *job);
656bbffc 172Job* job_install(Job *j);
e0209d83 173int job_install_deserialized(Job *j);
05d576f1 174void job_uninstall(Job *j);
ceed3570 175void job_dump(Job *j, FILE*f, const char *prefix);
39a18c60
MS
176int job_serialize(Job *j, FILE *f, FDSet *fds);
177int job_deserialize(Job *j, FILE *f, FDSet *fds);
178int job_coldplug(Job *j);
60918275 179
1da4264f
MS
180JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts);
181void job_dependency_free(JobDependency *l);
e5b5ae50 182
e5b5ae50
LP
183int job_merge(Job *j, Job *other);
184
348e27fe
MS
185JobType job_type_lookup_merge(JobType a, JobType b);
186
348e27fe
MS
187static inline bool job_type_is_mergeable(JobType a, JobType b) {
188 return job_type_lookup_merge(a, b) >= 0;
189}
190
191static inline bool job_type_is_conflicting(JobType a, JobType b) {
192 return !job_type_is_mergeable(a, b);
193}
194
195static inline bool job_type_is_superset(JobType a, JobType b) {
196 /* Checks whether operation a is a "superset" of b in its actions */
197 return a == job_type_lookup_merge(a, b);
198}
199
593fbdd2 200bool job_type_is_redundant(JobType a, UnitActiveState b);
5cb5a6ff 201
e0209d83
MS
202/* Collapses a state-dependent job type into a simpler type by observing
203 * the state of the unit which it is going to be applied to. */
204void job_type_collapse(JobType *t, Unit *u);
205
206int job_type_merge_and_collapse(JobType *a, JobType b, Unit *u);
207
47be870b
LP
208bool job_is_runnable(Job *j);
209
c1e1601e
LP
210void job_add_to_run_queue(Job *j);
211void job_add_to_dbus_queue(Job *j);
212
faf919f1
LP
213int job_start_timer(Job *j);
214void job_timer_event(Job *j, uint64_t n_elapsed, Watch *w);
215
5cb5a6ff 216int job_run_and_invalidate(Job *j);
5273510e 217int job_finish_and_invalidate(Job *j, JobResult result, bool recursive);
1ffba6fe 218
faf919f1
LP
219char *job_dbus_path(Job *j);
220
94f04347
LP
221const char* job_type_to_string(JobType t);
222JobType job_type_from_string(const char *s);
223
224const char* job_state_to_string(JobState t);
225JobState job_state_from_string(const char *s);
226
b548631a
LP
227const char* job_mode_to_string(JobMode t);
228JobMode job_mode_from_string(const char *s);
229
5d44db4a
LP
230const char* job_result_to_string(JobResult t);
231JobResult job_result_from_string(const char *s);
232
60918275 233#endif