]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/job.h
core: refactoring: add job_type_to_access_method
[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"
71d35b6b 29#include "unit-name.h"
07630cea 30
60918275 31typedef struct Job Job;
e5b5ae50 32typedef struct JobDependency JobDependency;
60918275 33typedef enum JobType JobType;
e5b5ae50 34typedef enum JobState JobState;
5cb5a6ff 35typedef enum JobMode JobMode;
5d44db4a 36typedef enum JobResult JobResult;
60918275 37
348e27fe 38/* Be careful when changing the job types! Adjust job_merging_table[] accordingly! */
60918275 39enum JobType {
87f0e418 40 JOB_START, /* if a unit does not support being started, we'll just wait until it becomes active */
5cb5a6ff
LP
41 JOB_VERIFY_ACTIVE,
42
60918275 43 JOB_STOP,
5cb5a6ff 44
e0209d83 45 JOB_RELOAD, /* if running, reload */
5cb5a6ff
LP
46
47 /* Note that restarts are first treated like JOB_STOP, but
48 * then instead of finishing are patched to become
49 * JOB_START. */
e0209d83
MS
50 JOB_RESTART, /* If running, stop. Then start unconditionally. */
51
52 _JOB_TYPE_MAX_MERGING,
53
54 /* JOB_NOP can enter into a transaction, but as it won't pull in
7e803f5e
MS
55 * any dependencies and it uses the special 'nop_job' slot in Unit,
56 * it won't have to merge with anything (except possibly into another
57 * JOB_NOP, previously installed). JOB_NOP is special-cased in
58 * job_type_is_*() functions so that the transaction can be
59 * activated. */
e0209d83
MS
60 JOB_NOP = _JOB_TYPE_MAX_MERGING, /* do nothing */
61
62 _JOB_TYPE_MAX_IN_TRANSACTION,
63
64 /* JOB_TRY_RESTART can never appear in a transaction, because
65 * it always collapses into JOB_RESTART or JOB_NOP before entering.
66 * Thus we never need to merge it with anything. */
67 JOB_TRY_RESTART = _JOB_TYPE_MAX_IN_TRANSACTION, /* if running, stop and then start */
68
3282591d
LP
69 /* Similar to JOB_TRY_RESTART but collapses to JOB_RELOAD or JOB_NOP */
70 JOB_TRY_RELOAD,
71
e0209d83
MS
72 /* JOB_RELOAD_OR_START won't enter into a transaction and cannot result
73 * from transaction merging (there's no way for JOB_RELOAD and
74 * JOB_START to meet in one transaction). It can result from a merge
75 * during job installation, but then it will immediately collapse into
76 * one of the two simpler types. */
77 JOB_RELOAD_OR_START, /* if running, reload, otherwise start */
5cb5a6ff 78
e5b5ae50
LP
79 _JOB_TYPE_MAX,
80 _JOB_TYPE_INVALID = -1
60918275
LP
81};
82
e5b5ae50 83enum JobState {
60918275
LP
84 JOB_WAITING,
85 JOB_RUNNING,
94f04347
LP
86 _JOB_STATE_MAX,
87 _JOB_STATE_INVALID = -1
e5b5ae50 88};
60918275
LP
89
90enum JobMode {
cebe0d41
LP
91 JOB_FAIL, /* Fail if a conflicting job is already queued */
92 JOB_REPLACE, /* Replace an existing conflicting job */
d420282b 93 JOB_REPLACE_IRREVERSIBLY,/* Like JOB_REPLACE + produce irreversible jobs */
cebe0d41 94 JOB_ISOLATE, /* Start a unit, and stop all others */
255baef6 95 JOB_FLUSH, /* Flush out all other queued jobs when queing this one */
cebe0d41
LP
96 JOB_IGNORE_DEPENDENCIES, /* Ignore both requirement and ordering dependencies */
97 JOB_IGNORE_REQUIREMENTS, /* Ignore requirement dependencies */
b548631a
LP
98 _JOB_MODE_MAX,
99 _JOB_MODE_INVALID = -1
60918275
LP
100};
101
5d44db4a 102enum JobResult {
65eb544e
MS
103 JOB_DONE, /* Job completed successfully */
104 JOB_CANCELED, /* Job canceled by a conflicting job installation or by explicit cancel request */
0faacd47 105 JOB_TIMEOUT, /* Job timeout elapsed */
65eb544e
MS
106 JOB_FAILED, /* Job failed */
107 JOB_DEPENDENCY, /* A required dependency job did not result in JOB_DONE */
6a371e23
ZJS
108 JOB_SKIPPED, /* Negative result of JOB_VERIFY_ACTIVE */
109 JOB_INVALID, /* JOB_RELOAD of inactive unit */
59fccdc5 110 JOB_ASSERT, /* Couldn't start a unit, because an assert didn't hold */
0faacd47 111 JOB_UNSUPPORTED, /* Couldn't start a unit, because the unit type is not supported on the system */
5d44db4a
LP
112 _JOB_RESULT_MAX,
113 _JOB_RESULT_INVALID = -1
114};
115
c6918296 116#include "unit.h"
c6918296 117
e5b5ae50
LP
118struct JobDependency {
119 /* Encodes that the 'subject' job needs the 'object' job in
120 * some way. This structure is used only while building a transaction. */
121 Job *subject;
122 Job *object;
123
034c6ed7
LP
124 LIST_FIELDS(JobDependency, subject);
125 LIST_FIELDS(JobDependency, object);
9d58f1db
LP
126
127 bool matters;
69dd2852 128 bool conflicts;
e5b5ae50
LP
129};
130
60918275
LP
131struct Job {
132 Manager *manager;
87f0e418 133 Unit *unit;
e5b5ae50 134
034c6ed7
LP
135 LIST_FIELDS(Job, transaction);
136 LIST_FIELDS(Job, run_queue);
c1e1601e 137 LIST_FIELDS(Job, dbus_queue);
e5b5ae50 138
44d8db9e
LP
139 LIST_HEAD(JobDependency, subject_list);
140 LIST_HEAD(JobDependency, object_list);
e5b5ae50 141
5cb5a6ff 142 /* Used for graph algs as a "I have been here" marker */
e5b5ae50
LP
143 Job* marker;
144 unsigned generation;
034c6ed7 145
9d58f1db
LP
146 uint32_t id;
147
148 JobType type;
149 JobState state;
150
718db961
LP
151 sd_event_source *timer_event_source;
152 usec_t begin_usec;
faf919f1 153
b39a2770
SW
154 /*
155 * This tracks where to send signals, and also which clients
156 * are allowed to call DBus methods on the job (other than
157 * root).
158 *
159 * There can be more than one client, because of job merging.
160 */
161 sd_bus_track *clients;
162 char **deserialized_clients;
a567261a 163
5d44db4a
LP
164 JobResult result;
165
9d58f1db
LP
166 bool installed:1;
167 bool in_run_queue:1;
168 bool matters_to_anchor:1;
9d58f1db
LP
169 bool in_dbus_queue:1;
170 bool sent_dbus_new_signal:1;
cebe0d41 171 bool ignore_order:1;
23ade460 172 bool irreversible:1;
60918275
LP
173};
174
668ad332 175Job* job_new(Unit *unit, JobType type);
39a18c60 176Job* job_new_raw(Unit *unit);
60918275 177void job_free(Job *job);
656bbffc 178Job* job_install(Job *j);
e0209d83 179int job_install_deserialized(Job *j);
05d576f1 180void job_uninstall(Job *j);
ceed3570 181void job_dump(Job *j, FILE*f, const char *prefix);
39a18c60
MS
182int job_serialize(Job *j, FILE *f, FDSet *fds);
183int job_deserialize(Job *j, FILE *f, FDSet *fds);
184int job_coldplug(Job *j);
60918275 185
1da4264f
MS
186JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts);
187void job_dependency_free(JobDependency *l);
e5b5ae50 188
e5b5ae50
LP
189int job_merge(Job *j, Job *other);
190
44a6b1b6 191JobType job_type_lookup_merge(JobType a, JobType b) _pure_;
348e27fe 192
44a6b1b6 193_pure_ static inline bool job_type_is_mergeable(JobType a, JobType b) {
348e27fe
MS
194 return job_type_lookup_merge(a, b) >= 0;
195}
196
44a6b1b6 197_pure_ static inline bool job_type_is_conflicting(JobType a, JobType b) {
7e803f5e 198 return a != JOB_NOP && b != JOB_NOP && !job_type_is_mergeable(a, b);
348e27fe
MS
199}
200
44a6b1b6 201_pure_ static inline bool job_type_is_superset(JobType a, JobType b) {
348e27fe 202 /* Checks whether operation a is a "superset" of b in its actions */
7e803f5e
MS
203 if (b == JOB_NOP)
204 return true;
205 if (a == JOB_NOP)
206 return false;
348e27fe
MS
207 return a == job_type_lookup_merge(a, b);
208}
209
44a6b1b6 210bool job_type_is_redundant(JobType a, UnitActiveState b) _pure_;
5cb5a6ff 211
e0209d83
MS
212/* Collapses a state-dependent job type into a simpler type by observing
213 * the state of the unit which it is going to be applied to. */
c6497ccb 214JobType job_type_collapse(JobType t, Unit *u);
e0209d83
MS
215
216int job_type_merge_and_collapse(JobType *a, JobType b, Unit *u);
217
c1e1601e
LP
218void job_add_to_run_queue(Job *j);
219void job_add_to_dbus_queue(Job *j);
220
faf919f1 221int job_start_timer(Job *j);
faf919f1 222
5cb5a6ff 223int job_run_and_invalidate(Job *j);
5273510e 224int job_finish_and_invalidate(Job *j, JobResult result, bool recursive);
1ffba6fe 225
faf919f1
LP
226char *job_dbus_path(Job *j);
227
c65eb836
LP
228void job_shutdown_magic(Job *j);
229
44a6b1b6
ZJS
230const char* job_type_to_string(JobType t) _const_;
231JobType job_type_from_string(const char *s) _pure_;
94f04347 232
44a6b1b6
ZJS
233const char* job_state_to_string(JobState t) _const_;
234JobState job_state_from_string(const char *s) _pure_;
94f04347 235
44a6b1b6
ZJS
236const char* job_mode_to_string(JobMode t) _const_;
237JobMode job_mode_from_string(const char *s) _pure_;
b548631a 238
44a6b1b6
ZJS
239const char* job_result_to_string(JobResult t) _const_;
240JobResult job_result_from_string(const char *s) _pure_;
68db7a3b
ZJS
241
242int job_get_timeout(Job *j, uint64_t *timeout) _pure_;
94bd7323
EV
243
244const char* job_type_to_access_method(JobType t);