job.h revision 3282591dc30b2934a895c7403d2f0b0690260947
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#pragma once
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster/***
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster This file is part of systemd.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster Copyright 2010 Lennart Poettering
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
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
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
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***/
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#include <stdbool.h>
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#include "sd-event.h"
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#include "list.h"
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#include "unit-name.h"
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostertypedef struct Job Job;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostertypedef struct JobDependency JobDependency;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostertypedef enum JobType JobType;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostertypedef enum JobState JobState;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostertypedef enum JobMode JobMode;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostertypedef enum JobResult JobResult;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster/* Be careful when changing the job types! Adjust job_merging_table[] accordingly! */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterenum JobType {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_START, /* if a unit does not support being started, we'll just wait until it becomes active */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_VERIFY_ACTIVE,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_STOP,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_RELOAD, /* if running, reload */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
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
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster _JOB_TYPE_MAX_MERGING,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
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
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster _JOB_TYPE_MAX_IN_TRANSACTION,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
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
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /* Similar to JOB_TRY_RESTART but collapses to JOB_RELOAD or JOB_NOP */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_TRY_RELOAD,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
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
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster _JOB_TYPE_MAX,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster _JOB_TYPE_INVALID = -1
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster};
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterenum JobState {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_WAITING,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_RUNNING,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster _JOB_STATE_MAX,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster _JOB_STATE_INVALID = -1
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster};
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterenum JobMode {
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_MODE_MAX,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster _JOB_MODE_INVALID = -1
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster};
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterenum JobResult {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_DONE, /* Job completed successfully */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_CANCELED, /* Job canceled by a conflicting job installation or by explicit cancel request */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_TIMEOUT, /* Job timeout elapsed */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JOB_FAILED, /* Job failed */
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_INVALID, /* JOB_RELOAD of inactive unit */
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 _JOB_RESULT_MAX,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster _JOB_RESULT_INVALID = -1
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster};
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#include "unit.h"
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterstruct JobDependency {
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 Job *subject;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster Job *object;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster LIST_FIELDS(JobDependency, subject);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster LIST_FIELDS(JobDependency, object);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster bool matters;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster bool conflicts;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster};
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterstruct Job {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster Manager *manager;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster Unit *unit;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster LIST_FIELDS(Job, transaction);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster LIST_FIELDS(Job, run_queue);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster LIST_FIELDS(Job, dbus_queue);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster LIST_HEAD(JobDependency, subject_list);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster LIST_HEAD(JobDependency, object_list);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /* Used for graph algs as a "I have been here" marker */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster Job* marker;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster unsigned generation;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster uint32_t id;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JobType type;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JobState state;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster sd_event_source *timer_event_source;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster usec_t begin_usec;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster /*
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 * root).
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster *
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster * There can be more than one client, because of job merging.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster */
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster sd_bus_track *clients;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster char **deserialized_clients;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster JobResult result;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster bool installed:1;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster bool in_run_queue:1;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster bool matters_to_anchor:1;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster bool in_dbus_queue:1;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster bool sent_dbus_new_signal:1;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster bool ignore_order:1;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster bool irreversible:1;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster};
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJob* job_new(Unit *unit, JobType type);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJob* job_new_raw(Unit *unit);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostervoid job_free(Job *job);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJob* job_install(Job *j);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_install_deserialized(Job *j);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostervoid job_uninstall(Job *j);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostervoid job_dump(Job *j, FILE*f, const char *prefix);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_serialize(Job *j, FILE *f, FDSet *fds);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_deserialize(Job *j, FILE *f, FDSet *fds);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_coldplug(Job *j);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostervoid job_dependency_free(JobDependency *l);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_merge(Job *j, Job *other);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobType job_type_lookup_merge(JobType a, JobType b) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
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}
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
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}
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
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 if (b == JOB_NOP)
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster return true;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster if (a == JOB_NOP)
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster return false;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster return a == job_type_lookup_merge(a, b);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster}
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterbool job_type_is_redundant(JobType a, UnitActiveState b) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
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 FosterJobType job_type_collapse(JobType t, Unit *u);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_type_merge_and_collapse(JobType *a, JobType b, Unit *u);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostervoid job_add_to_run_queue(Job *j);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostervoid job_add_to_dbus_queue(Job *j);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_start_timer(Job *j);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_run_and_invalidate(Job *j);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_finish_and_invalidate(Job *j, JobResult result, bool recursive);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterchar *job_dbus_path(Job *j);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostervoid job_shutdown_magic(Job *j);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterconst char* job_type_to_string(JobType t) _const_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobType job_type_from_string(const char *s) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterconst char* job_state_to_string(JobState t) _const_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobState job_state_from_string(const char *s) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterconst char* job_mode_to_string(JobMode t) _const_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobMode job_mode_from_string(const char *s) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterconst char* job_result_to_string(JobResult t) _const_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterJobResult job_result_from_string(const char *s) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fosterint job_get_timeout(Job *j, uint64_t *timeout) _pure_;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster