]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/job.h
util-lib: split our string related calls from util.[ch] into its own file string...
[thirdparty/systemd.git] / src / core / job.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
60918275 2
c2f1db8f 3#pragma once
60918275 4
a7334b09
LP
5/***
6 This file is part of systemd.
7
8 Copyright 2010 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 18 Lesser General Public License for more details.
a7334b09 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
60918275 24#include <stdbool.h>
60918275 25
07630cea
LP
26#include "sd-event.h"
27
28#include "list.h"
29
60918275 30typedef struct Job Job;
e5b5ae50 31typedef struct JobDependency JobDependency;
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
7e803f5e
MS
54 * any dependencies and it uses the special 'nop_job' slot in Unit,
55 * it won't have to merge with anything (except possibly into another
56 * JOB_NOP, previously installed). JOB_NOP is special-cased in
57 * job_type_is_*() functions so that the transaction can be
58 * activated. */
e0209d83
MS
59 JOB_NOP = _JOB_TYPE_MAX_MERGING, /* do nothing */
60
61 _JOB_TYPE_MAX_IN_TRANSACTION,
62
63 /* JOB_TRY_RESTART can never appear in a transaction, because
64 * it always collapses into JOB_RESTART or JOB_NOP before entering.
65 * Thus we never need to merge it with anything. */
66 JOB_TRY_RESTART = _JOB_TYPE_MAX_IN_TRANSACTION, /* if running, stop and then start */
67
68 /* JOB_RELOAD_OR_START won't enter into a transaction and cannot result
69 * from transaction merging (there's no way for JOB_RELOAD and
70 * JOB_START to meet in one transaction). It can result from a merge
71 * during job installation, but then it will immediately collapse into
72 * one of the two simpler types. */
73 JOB_RELOAD_OR_START, /* if running, reload, otherwise start */
5cb5a6ff 74
e5b5ae50
LP
75 _JOB_TYPE_MAX,
76 _JOB_TYPE_INVALID = -1
60918275
LP
77};
78
e5b5ae50 79enum JobState {
60918275
LP
80 JOB_WAITING,
81 JOB_RUNNING,
94f04347
LP
82 _JOB_STATE_MAX,
83 _JOB_STATE_INVALID = -1
e5b5ae50 84};
60918275
LP
85
86enum JobMode {
cebe0d41
LP
87 JOB_FAIL, /* Fail if a conflicting job is already queued */
88 JOB_REPLACE, /* Replace an existing conflicting job */
d420282b 89 JOB_REPLACE_IRREVERSIBLY,/* Like JOB_REPLACE + produce irreversible jobs */
cebe0d41 90 JOB_ISOLATE, /* Start a unit, and stop all others */
255baef6 91 JOB_FLUSH, /* Flush out all other queued jobs when queing this one */
cebe0d41
LP
92 JOB_IGNORE_DEPENDENCIES, /* Ignore both requirement and ordering dependencies */
93 JOB_IGNORE_REQUIREMENTS, /* Ignore requirement dependencies */
b548631a
LP
94 _JOB_MODE_MAX,
95 _JOB_MODE_INVALID = -1
60918275
LP
96};
97
5d44db4a 98enum JobResult {
65eb544e
MS
99 JOB_DONE, /* Job completed successfully */
100 JOB_CANCELED, /* Job canceled by a conflicting job installation or by explicit cancel request */
0faacd47 101 JOB_TIMEOUT, /* Job timeout elapsed */
65eb544e
MS
102 JOB_FAILED, /* Job failed */
103 JOB_DEPENDENCY, /* A required dependency job did not result in JOB_DONE */
6a371e23
ZJS
104 JOB_SKIPPED, /* Negative result of JOB_VERIFY_ACTIVE */
105 JOB_INVALID, /* JOB_RELOAD of inactive unit */
59fccdc5 106 JOB_ASSERT, /* Couldn't start a unit, because an assert didn't hold */
0faacd47 107 JOB_UNSUPPORTED, /* Couldn't start a unit, because the unit type is not supported on the system */
5d44db4a
LP
108 _JOB_RESULT_MAX,
109 _JOB_RESULT_INVALID = -1
110};
111
c6918296 112#include "unit.h"
c6918296 113
e5b5ae50
LP
114struct JobDependency {
115 /* Encodes that the 'subject' job needs the 'object' job in
116 * some way. This structure is used only while building a transaction. */
117 Job *subject;
118 Job *object;
119
034c6ed7
LP
120 LIST_FIELDS(JobDependency, subject);
121 LIST_FIELDS(JobDependency, object);
9d58f1db
LP
122
123 bool matters;
69dd2852 124 bool conflicts;
e5b5ae50
LP
125};
126
60918275
LP
127struct Job {
128 Manager *manager;
87f0e418 129 Unit *unit;
e5b5ae50 130
034c6ed7
LP
131 LIST_FIELDS(Job, transaction);
132 LIST_FIELDS(Job, run_queue);
c1e1601e 133 LIST_FIELDS(Job, dbus_queue);
e5b5ae50 134
44d8db9e
LP
135 LIST_HEAD(JobDependency, subject_list);
136 LIST_HEAD(JobDependency, object_list);
e5b5ae50 137
5cb5a6ff 138 /* Used for graph algs as a "I have been here" marker */
e5b5ae50
LP
139 Job* marker;
140 unsigned generation;
034c6ed7 141
9d58f1db
LP
142 uint32_t id;
143
144 JobType type;
145 JobState state;
146
718db961
LP
147 sd_event_source *timer_event_source;
148 usec_t begin_usec;
faf919f1 149
b39a2770
SW
150 /*
151 * This tracks where to send signals, and also which clients
152 * are allowed to call DBus methods on the job (other than
153 * root).
154 *
155 * There can be more than one client, because of job merging.
156 */
157 sd_bus_track *clients;
158 char **deserialized_clients;
a567261a 159
5d44db4a
LP
160 JobResult result;
161
9d58f1db
LP
162 bool installed:1;
163 bool in_run_queue:1;
164 bool matters_to_anchor:1;
165 bool override:1;
166 bool in_dbus_queue:1;
167 bool sent_dbus_new_signal:1;
cebe0d41 168 bool ignore_order:1;
23ade460 169 bool irreversible:1;
60918275
LP
170};
171
668ad332 172Job* job_new(Unit *unit, JobType type);
39a18c60 173Job* job_new_raw(Unit *unit);
60918275 174void job_free(Job *job);
656bbffc 175Job* job_install(Job *j);
e0209d83 176int job_install_deserialized(Job *j);
05d576f1 177void job_uninstall(Job *j);
ceed3570 178void job_dump(Job *j, FILE*f, const char *prefix);
39a18c60
MS
179int job_serialize(Job *j, FILE *f, FDSet *fds);
180int job_deserialize(Job *j, FILE *f, FDSet *fds);
181int job_coldplug(Job *j);
60918275 182
1da4264f
MS
183JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts);
184void job_dependency_free(JobDependency *l);
e5b5ae50 185
e5b5ae50
LP
186int job_merge(Job *j, Job *other);
187
44a6b1b6 188JobType job_type_lookup_merge(JobType a, JobType b) _pure_;
348e27fe 189
44a6b1b6 190_pure_ static inline bool job_type_is_mergeable(JobType a, JobType b) {
348e27fe
MS
191 return job_type_lookup_merge(a, b) >= 0;
192}
193
44a6b1b6 194_pure_ static inline bool job_type_is_conflicting(JobType a, JobType b) {
7e803f5e 195 return a != JOB_NOP && b != JOB_NOP && !job_type_is_mergeable(a, b);
348e27fe
MS
196}
197
44a6b1b6 198_pure_ static inline bool job_type_is_superset(JobType a, JobType b) {
348e27fe 199 /* Checks whether operation a is a "superset" of b in its actions */
7e803f5e
MS
200 if (b == JOB_NOP)
201 return true;
202 if (a == JOB_NOP)
203 return false;
348e27fe
MS
204 return a == job_type_lookup_merge(a, b);
205}
206
44a6b1b6 207bool job_type_is_redundant(JobType a, UnitActiveState b) _pure_;
5cb5a6ff 208
e0209d83
MS
209/* Collapses a state-dependent job type into a simpler type by observing
210 * the state of the unit which it is going to be applied to. */
c6497ccb 211JobType job_type_collapse(JobType t, Unit *u);
e0209d83
MS
212
213int job_type_merge_and_collapse(JobType *a, JobType b, Unit *u);
214
c1e1601e
LP
215void job_add_to_run_queue(Job *j);
216void job_add_to_dbus_queue(Job *j);
217
faf919f1 218int job_start_timer(Job *j);
faf919f1 219
5cb5a6ff 220int job_run_and_invalidate(Job *j);
5273510e 221int job_finish_and_invalidate(Job *j, JobResult result, bool recursive);
1ffba6fe 222
faf919f1
LP
223char *job_dbus_path(Job *j);
224
c65eb836
LP
225void job_shutdown_magic(Job *j);
226
44a6b1b6
ZJS
227const char* job_type_to_string(JobType t) _const_;
228JobType job_type_from_string(const char *s) _pure_;
94f04347 229
44a6b1b6
ZJS
230const char* job_state_to_string(JobState t) _const_;
231JobState job_state_from_string(const char *s) _pure_;
94f04347 232
44a6b1b6
ZJS
233const char* job_mode_to_string(JobMode t) _const_;
234JobMode job_mode_from_string(const char *s) _pure_;
b548631a 235
44a6b1b6
ZJS
236const char* job_result_to_string(JobResult t) _const_;
237JobResult job_result_from_string(const char *s) _pure_;
68db7a3b
ZJS
238
239int job_get_timeout(Job *j, uint64_t *timeout) _pure_;