job.h revision 3282591dc30b2934a895c7403d2f0b0690260947
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster This file is part of systemd.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster Copyright 2010 Lennart Poettering
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster systemd is free software; you can redistribute it and/or modify it
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster under the terms of the GNU Lesser General Public License as published by
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster the Free Software Foundation; either version 2.1 of the License, or
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster (at your option) any later version.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster systemd is distributed in the hope that it will be useful, but
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster WITHOUT ANY WARRANTY; without even the implied warranty of
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster Lesser General Public License for more details.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster You should have received a copy of the GNU Lesser General Public License
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster along with systemd; If not, see <http://www.gnu.org/licenses/>.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster/* Be careful when changing the job types! Adjust job_merging_table[] accordingly! */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_START, /* if a unit does not support being started, we'll just wait until it becomes active */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /* Note that restarts are first treated like JOB_STOP, but
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * then instead of finishing are patched to become
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * JOB_START. */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_RESTART, /* If running, stop. Then start unconditionally. */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /* JOB_NOP can enter into a transaction, but as it won't pull in
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * any dependencies and it uses the special 'nop_job' slot in Unit,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * it won't have to merge with anything (except possibly into another
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * JOB_NOP, previously installed). JOB_NOP is special-cased in
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * job_type_is_*() functions so that the transaction can be
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * activated. */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_NOP = _JOB_TYPE_MAX_MERGING, /* do nothing */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /* JOB_TRY_RESTART can never appear in a transaction, because
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * it always collapses into JOB_RESTART or JOB_NOP before entering.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * Thus we never need to merge it with anything. */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_TRY_RESTART = _JOB_TYPE_MAX_IN_TRANSACTION, /* if running, stop and then start */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /* Similar to JOB_TRY_RESTART but collapses to JOB_RELOAD or JOB_NOP */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /* JOB_RELOAD_OR_START won't enter into a transaction and cannot result
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * from transaction merging (there's no way for JOB_RELOAD and
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * JOB_START to meet in one transaction). It can result from a merge
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * during job installation, but then it will immediately collapse into
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * one of the two simpler types. */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_RELOAD_OR_START, /* if running, reload, otherwise start */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_FAIL, /* Fail if a conflicting job is already queued */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_REPLACE, /* Replace an existing conflicting job */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_REPLACE_IRREVERSIBLY,/* Like JOB_REPLACE + produce irreversible jobs */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_ISOLATE, /* Start a unit, and stop all others */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_FLUSH, /* Flush out all other queued jobs when queing this one */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_IGNORE_DEPENDENCIES, /* Ignore both requirement and ordering dependencies */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_IGNORE_REQUIREMENTS, /* Ignore requirement dependencies */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_CANCELED, /* Job canceled by a conflicting job installation or by explicit cancel request */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_DEPENDENCY, /* A required dependency job did not result in JOB_DONE */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_SKIPPED, /* Negative result of JOB_VERIFY_ACTIVE */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_ASSERT, /* Couldn't start a unit, because an assert didn't hold */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_UNSUPPORTED, /* Couldn't start a unit, because the unit type is not supported on the system */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /* Encodes that the 'subject' job needs the 'object' job in
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * some way. This structure is used only while building a transaction. */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /* Used for graph algs as a "I have been here" marker */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * This tracks where to send signals, and also which clients
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * are allowed to call DBus methods on the job (other than
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * There can be more than one client, because of job merging.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostervoid job_dump(Job *j, FILE*f, const char *prefix);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_deserialize(Job *j, FILE *f, FDSet *fds);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobType job_type_lookup_merge(JobType a, JobType b) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster_pure_ static inline bool job_type_is_mergeable(JobType a, JobType b) {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster return job_type_lookup_merge(a, b) >= 0;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster_pure_ static inline bool job_type_is_conflicting(JobType a, JobType b) {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster return a != JOB_NOP && b != JOB_NOP && !job_type_is_mergeable(a, b);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster_pure_ static inline bool job_type_is_superset(JobType a, JobType b) {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /* Checks whether operation a is a "superset" of b in its actions */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster return true;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster return false;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster return a == job_type_lookup_merge(a, b);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterbool job_type_is_redundant(JobType a, UnitActiveState b) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster/* Collapses a state-dependent job type into a simpler type by observing
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * the state of the unit which it is going to be applied to. */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_type_merge_and_collapse(JobType *a, JobType b, Unit *u);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_finish_and_invalidate(Job *j, JobResult result, bool recursive);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterconst char* job_type_to_string(JobType t) _const_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobType job_type_from_string(const char *s) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterconst char* job_state_to_string(JobState t) _const_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobState job_state_from_string(const char *s) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterconst char* job_mode_to_string(JobMode t) _const_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobMode job_mode_from_string(const char *s) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterconst char* job_result_to_string(JobResult t) _const_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobResult job_result_from_string(const char *s) _pure_;