2009-11-18 02:42:52 +03:00
/*-*- Mode: C; c-basic-offset: 8 -*-*/
# ifndef foojobhfoo
# define foojobhfoo
2010-02-03 15:03:47 +03:00
/***
This file is part of systemd .
Copyright 2010 Lennart Poettering
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
systemd is distributed in the hope that it will be useful , but
WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
General Public License for more details .
You should have received a copy of the GNU General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
2009-11-18 02:42:52 +03:00
# include <stdbool.h>
# include <inttypes.h>
typedef struct Job Job ;
2010-01-20 04:12:51 +03:00
typedef struct JobDependency JobDependency ;
2009-11-18 02:42:52 +03:00
typedef enum JobType JobType ;
2010-01-20 04:12:51 +03:00
typedef enum JobState JobState ;
2010-01-23 03:52:57 +03:00
typedef enum JobMode JobMode ;
2009-11-18 02:42:52 +03:00
# include "manager.h"
2010-01-26 23:39:06 +03:00
# include "unit.h"
2009-11-18 02:42:52 +03:00
# include "hashmap.h"
# include "list.h"
enum JobType {
2010-01-26 23:39:06 +03:00
JOB_START , /* if a unit does not support being started, we'll just wait until it becomes active */
2010-01-23 03:52:57 +03:00
JOB_VERIFY_ACTIVE ,
2009-11-18 02:42:52 +03:00
JOB_STOP ,
2010-01-23 03:52:57 +03:00
JOB_RELOAD , /* if running reload */
JOB_RELOAD_OR_START , /* if running reload, if not running start */
/* Note that restarts are first treated like JOB_STOP, but
* then instead of finishing are patched to become
* JOB_START . */
JOB_RESTART , /* if running stop, then start unconditionally */
JOB_TRY_RESTART , /* if running stop and then start */
2010-01-20 04:12:51 +03:00
_JOB_TYPE_MAX ,
_JOB_TYPE_INVALID = - 1
2009-11-18 02:42:52 +03:00
} ;
2010-01-20 04:12:51 +03:00
enum JobState {
2009-11-18 02:42:52 +03:00
JOB_WAITING ,
JOB_RUNNING ,
2010-01-30 03:55:42 +03:00
_JOB_STATE_MAX ,
_JOB_STATE_INVALID = - 1
2010-01-20 04:12:51 +03:00
} ;
2009-11-18 02:42:52 +03:00
enum JobMode {
JOB_FAIL ,
JOB_REPLACE ,
2010-02-03 14:37:42 +03:00
_JOB_MODE_MAX ,
_JOB_MODE_INVALID = - 1
2009-11-18 02:42:52 +03:00
} ;
2010-01-20 04:12:51 +03:00
struct JobDependency {
/* Encodes that the 'subject' job needs the 'object' job in
* some way . This structure is used only while building a transaction . */
Job * subject ;
Job * object ;
bool matters ;
2010-01-26 06:18:44 +03:00
LIST_FIELDS ( JobDependency , subject ) ;
LIST_FIELDS ( JobDependency , object ) ;
2010-01-20 04:12:51 +03:00
} ;
2009-11-18 02:42:52 +03:00
struct Job {
Manager * manager ;
uint32_t id ;
2010-01-26 23:39:06 +03:00
Unit * unit ;
2010-01-20 04:12:51 +03:00
2009-11-18 02:42:52 +03:00
JobType type ;
JobState state ;
2010-01-26 21:25:02 +03:00
bool installed : 1 ;
2010-01-26 06:18:44 +03:00
bool in_run_queue : 1 ;
2010-01-20 04:12:51 +03:00
bool matters_to_anchor : 1 ;
2010-04-15 05:11:11 +04:00
bool override : 1 ;
2010-02-05 02:38:41 +03:00
bool in_dbus_queue : 1 ;
bool sent_dbus_new_signal : 1 ;
2010-01-20 04:12:51 +03:00
2010-01-26 06:18:44 +03:00
LIST_FIELDS ( Job , transaction ) ;
LIST_FIELDS ( Job , run_queue ) ;
2010-02-05 02:38:41 +03:00
LIST_FIELDS ( Job , dbus_queue ) ;
2010-01-20 04:12:51 +03:00
2010-01-26 09:02:51 +03:00
LIST_HEAD ( JobDependency , subject_list ) ;
LIST_HEAD ( JobDependency , object_list ) ;
2010-01-20 04:12:51 +03:00
2010-01-23 03:52:57 +03:00
/* Used for graph algs as a "I have been here" marker */
2010-01-20 04:12:51 +03:00
Job * marker ;
unsigned generation ;
2010-01-26 06:18:44 +03:00
2009-11-18 02:42:52 +03:00
} ;
2010-01-26 23:39:06 +03:00
Job * job_new ( Manager * m , JobType type , Unit * unit ) ;
2009-11-18 02:42:52 +03:00
void job_free ( Job * job ) ;
2010-01-20 04:35:46 +03:00
void job_dump ( Job * j , FILE * f , const char * prefix ) ;
2009-11-18 02:42:52 +03:00
2010-01-20 04:12:51 +03:00
JobDependency * job_dependency_new ( Job * subject , Job * object , bool matters ) ;
void job_dependency_free ( JobDependency * l ) ;
void job_dependency_delete ( Job * subject , Job * object , bool * matters ) ;
bool job_is_anchor ( Job * j ) ;
int job_merge ( Job * j , Job * other ) ;
2010-01-21 02:51:37 +03:00
int job_type_merge ( JobType * a , JobType b ) ;
2010-01-23 03:52:57 +03:00
bool job_type_is_mergeable ( JobType a , JobType b ) ;
2010-01-21 02:51:37 +03:00
bool job_type_is_superset ( JobType a , JobType b ) ;
2010-01-21 04:59:12 +03:00
bool job_type_is_conflicting ( JobType a , JobType b ) ;
2010-04-06 04:39:16 +04:00
bool job_type_is_redundant ( JobType a , UnitActiveState b ) ;
2010-01-23 03:52:57 +03:00
2010-02-03 16:21:48 +03:00
bool job_is_runnable ( Job * j ) ;
2010-02-05 02:38:41 +03:00
void job_add_to_run_queue ( Job * j ) ;
void job_add_to_dbus_queue ( Job * j ) ;
2010-01-23 03:52:57 +03:00
int job_run_and_invalidate ( Job * j ) ;
int job_finish_and_invalidate ( Job * j , bool success ) ;
2010-01-21 02:51:37 +03:00
2010-01-30 03:55:42 +03:00
const char * job_type_to_string ( JobType t ) ;
JobType job_type_from_string ( const char * s ) ;
const char * job_state_to_string ( JobState t ) ;
JobState job_state_from_string ( const char * s ) ;
2010-02-03 14:37:42 +03:00
const char * job_mode_to_string ( JobMode t ) ;
JobMode job_mode_from_string ( const char * s ) ;
2010-02-01 05:33:24 +03:00
char * job_dbus_path ( Job * j ) ;
2009-11-18 02:42:52 +03:00
# endif