]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/job.h
relicense to LGPLv2.1 (with exceptions)
[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;
60918275 31typedef enum JobType JobType;
e5b5ae50 32typedef enum JobState JobState;
5cb5a6ff 33typedef enum JobMode JobMode;
5d44db4a 34typedef enum JobResult JobResult;
60918275
LP
35
36#include "manager.h"
87f0e418 37#include "unit.h"
60918275
LP
38#include "hashmap.h"
39#include "list.h"
40
348e27fe 41/* Be careful when changing the job types! Adjust job_merging_table[] accordingly! */
60918275 42enum JobType {
87f0e418 43 JOB_START, /* if a unit does not support being started, we'll just wait until it becomes active */
5cb5a6ff
LP
44 JOB_VERIFY_ACTIVE,
45
60918275 46 JOB_STOP,
5cb5a6ff
LP
47
48 JOB_RELOAD, /* if running reload */
49 JOB_RELOAD_OR_START, /* if running reload, if not running start */
50
51 /* Note that restarts are first treated like JOB_STOP, but
52 * then instead of finishing are patched to become
53 * JOB_START. */
54 JOB_RESTART, /* if running stop, then start unconditionally */
55 JOB_TRY_RESTART, /* if running stop and then start */
56
e5b5ae50
LP
57 _JOB_TYPE_MAX,
58 _JOB_TYPE_INVALID = -1
60918275
LP
59};
60
e5b5ae50 61enum JobState {
60918275
LP
62 JOB_WAITING,
63 JOB_RUNNING,
94f04347
LP
64 _JOB_STATE_MAX,
65 _JOB_STATE_INVALID = -1
e5b5ae50 66};
60918275
LP
67
68enum JobMode {
cebe0d41
LP
69 JOB_FAIL, /* Fail if a conflicting job is already queued */
70 JOB_REPLACE, /* Replace an existing conflicting job */
71 JOB_ISOLATE, /* Start a unit, and stop all others */
72 JOB_IGNORE_DEPENDENCIES, /* Ignore both requirement and ordering dependencies */
73 JOB_IGNORE_REQUIREMENTS, /* Ignore requirement dependencies */
b548631a
LP
74 _JOB_MODE_MAX,
75 _JOB_MODE_INVALID = -1
60918275
LP
76};
77
5d44db4a
LP
78enum JobResult {
79 JOB_DONE,
80 JOB_CANCELED,
81 JOB_TIMEOUT,
82 JOB_FAILED,
83 JOB_DEPENDENCY,
d68201e9 84 JOB_SKIPPED,
5d44db4a
LP
85 _JOB_RESULT_MAX,
86 _JOB_RESULT_INVALID = -1
87};
88
e5b5ae50
LP
89struct JobDependency {
90 /* Encodes that the 'subject' job needs the 'object' job in
91 * some way. This structure is used only while building a transaction. */
92 Job *subject;
93 Job *object;
94
034c6ed7
LP
95 LIST_FIELDS(JobDependency, subject);
96 LIST_FIELDS(JobDependency, object);
9d58f1db
LP
97
98 bool matters;
69dd2852 99 bool conflicts;
e5b5ae50
LP
100};
101
60918275
LP
102struct Job {
103 Manager *manager;
87f0e418 104 Unit *unit;
e5b5ae50 105
034c6ed7
LP
106 LIST_FIELDS(Job, transaction);
107 LIST_FIELDS(Job, run_queue);
c1e1601e 108 LIST_FIELDS(Job, dbus_queue);
e5b5ae50 109
44d8db9e
LP
110 LIST_HEAD(JobDependency, subject_list);
111 LIST_HEAD(JobDependency, object_list);
e5b5ae50 112
5cb5a6ff 113 /* Used for graph algs as a "I have been here" marker */
e5b5ae50
LP
114 Job* marker;
115 unsigned generation;
034c6ed7 116
9d58f1db
LP
117 uint32_t id;
118
119 JobType type;
120 JobState state;
121
faf919f1
LP
122 Watch timer_watch;
123
a567261a
LP
124 /* Note that this bus object is not ref counted here. */
125 DBusConnection *bus;
126 char *bus_client;
127
5d44db4a
LP
128 JobResult result;
129
9d58f1db
LP
130 bool installed:1;
131 bool in_run_queue:1;
132 bool matters_to_anchor:1;
133 bool override:1;
134 bool in_dbus_queue:1;
135 bool sent_dbus_new_signal:1;
cebe0d41 136 bool ignore_order:1;
60918275
LP
137};
138
87f0e418 139Job* job_new(Manager *m, JobType type, Unit *unit);
60918275 140void job_free(Job *job);
ceed3570 141void job_dump(Job *j, FILE*f, const char *prefix);
60918275 142
69dd2852 143JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts);
e5b5ae50 144void job_dependency_free(JobDependency *l);
e5b5ae50
LP
145
146bool job_is_anchor(Job *j);
147
148int job_merge(Job *j, Job *other);
149
348e27fe
MS
150JobType job_type_lookup_merge(JobType a, JobType b);
151
152static inline int job_type_merge(JobType *a, JobType b) {
153 JobType t = job_type_lookup_merge(*a, b);
154 if (t < 0)
155 return -EEXIST;
156 *a = t;
157 return 0;
158}
159
160static inline bool job_type_is_mergeable(JobType a, JobType b) {
161 return job_type_lookup_merge(a, b) >= 0;
162}
163
164static inline bool job_type_is_conflicting(JobType a, JobType b) {
165 return !job_type_is_mergeable(a, b);
166}
167
168static inline bool job_type_is_superset(JobType a, JobType b) {
169 /* Checks whether operation a is a "superset" of b in its actions */
170 return a == job_type_lookup_merge(a, b);
171}
172
593fbdd2 173bool job_type_is_redundant(JobType a, UnitActiveState b);
5cb5a6ff 174
47be870b
LP
175bool job_is_runnable(Job *j);
176
c1e1601e
LP
177void job_add_to_run_queue(Job *j);
178void job_add_to_dbus_queue(Job *j);
179
faf919f1
LP
180int job_start_timer(Job *j);
181void job_timer_event(Job *j, uint64_t n_elapsed, Watch *w);
182
5cb5a6ff 183int job_run_and_invalidate(Job *j);
5d44db4a 184int job_finish_and_invalidate(Job *j, JobResult result);
1ffba6fe 185
faf919f1
LP
186char *job_dbus_path(Job *j);
187
94f04347
LP
188const char* job_type_to_string(JobType t);
189JobType job_type_from_string(const char *s);
190
191const char* job_state_to_string(JobState t);
192JobState job_state_from_string(const char *s);
193
b548631a
LP
194const char* job_mode_to_string(JobMode t);
195JobMode job_mode_from_string(const char *s);
196
5d44db4a
LP
197const char* job_result_to_string(JobResult t);
198JobResult job_result_from_string(const char *s);
199
60918275 200#endif