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