]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/job.h
hashmap: be a bit more conservative with pre-allocating hash tables and items
[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 */
23ade460 86 JOB_REPLACE_IRREVERSIBLY, /* Like JOB_REPLACE + produce irreversible jobs */
cebe0d41
LP
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 94enum JobResult {
65eb544e
MS
95 JOB_DONE, /* Job completed successfully */
96 JOB_CANCELED, /* Job canceled by a conflicting job installation or by explicit cancel request */
97 JOB_TIMEOUT, /* JobTimeout elapsed */
98 JOB_FAILED, /* Job failed */
99 JOB_DEPENDENCY, /* A required dependency job did not result in JOB_DONE */
100 JOB_SKIPPED, /* JOB_RELOAD of inactive unit; negative result of JOB_VERIFY_ACTIVE */
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;
23ade460 165 bool irreversible:1;
60918275
LP
166};
167
97e6a119
MS
168JobBusClient* job_bus_client_new(DBusConnection *connection, const char *name);
169
668ad332 170Job* job_new(Unit *unit, JobType type);
39a18c60 171Job* job_new_raw(Unit *unit);
60918275 172void job_free(Job *job);
656bbffc 173Job* job_install(Job *j);
e0209d83 174int job_install_deserialized(Job *j);
05d576f1 175void job_uninstall(Job *j);
ceed3570 176void job_dump(Job *j, FILE*f, const char *prefix);
39a18c60
MS
177int job_serialize(Job *j, FILE *f, FDSet *fds);
178int job_deserialize(Job *j, FILE *f, FDSet *fds);
179int job_coldplug(Job *j);
60918275 180
1da4264f
MS
181JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts);
182void job_dependency_free(JobDependency *l);
e5b5ae50 183
e5b5ae50
LP
184int job_merge(Job *j, Job *other);
185
44a6b1b6 186JobType job_type_lookup_merge(JobType a, JobType b) _pure_;
348e27fe 187
44a6b1b6 188_pure_ static inline bool job_type_is_mergeable(JobType a, JobType b) {
348e27fe
MS
189 return job_type_lookup_merge(a, b) >= 0;
190}
191
44a6b1b6 192_pure_ static inline bool job_type_is_conflicting(JobType a, JobType b) {
348e27fe
MS
193 return !job_type_is_mergeable(a, b);
194}
195
44a6b1b6 196_pure_ static inline bool job_type_is_superset(JobType a, JobType b) {
348e27fe
MS
197 /* Checks whether operation a is a "superset" of b in its actions */
198 return a == job_type_lookup_merge(a, b);
199}
200
44a6b1b6 201bool job_type_is_redundant(JobType a, UnitActiveState b) _pure_;
5cb5a6ff 202
e0209d83
MS
203/* Collapses a state-dependent job type into a simpler type by observing
204 * the state of the unit which it is going to be applied to. */
205void job_type_collapse(JobType *t, Unit *u);
206
207int job_type_merge_and_collapse(JobType *a, JobType b, Unit *u);
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
c65eb836
LP
220void job_shutdown_magic(Job *j);
221
44a6b1b6
ZJS
222const char* job_type_to_string(JobType t) _const_;
223JobType job_type_from_string(const char *s) _pure_;
94f04347 224
44a6b1b6
ZJS
225const char* job_state_to_string(JobState t) _const_;
226JobState job_state_from_string(const char *s) _pure_;
94f04347 227
44a6b1b6
ZJS
228const char* job_mode_to_string(JobMode t) _const_;
229JobMode job_mode_from_string(const char *s) _pure_;
b548631a 230
44a6b1b6
ZJS
231const char* job_result_to_string(JobResult t) _const_;
232JobResult job_result_from_string(const char *s) _pure_;