2009-11-18 02:42:52 +03:00
/*-*- Mode: C; c-basic-offset: 8 -*-*/
# ifndef foomanagerhfoo
# define foomanagerhfoo
# include <stdbool.h>
# include <inttypes.h>
2010-01-19 02:22:34 +03:00
# include <stdio.h>
2009-11-18 02:42:52 +03:00
typedef struct Manager Manager ;
2010-01-27 06:31:52 +03:00
typedef enum WatchType WatchType ;
typedef struct Watch Watch ;
enum WatchType {
WATCH_INVALID ,
WATCH_SIGNAL_FD ,
WATCH_FD ,
WATCH_TIMER
} ;
struct Watch {
int fd ;
WatchType type ;
union Unit * unit ;
} ;
2009-11-18 02:42:52 +03:00
2010-01-26 23:39:06 +03:00
# include "unit.h"
2009-11-18 02:42:52 +03:00
# include "job.h"
# include "hashmap.h"
# include "list.h"
# include "set.h"
2010-01-28 04:01:15 +03:00
typedef enum SpecialUnit {
SPECIAL_SYSLOG_SERVICE ,
SPECIAL_DBUS_SERVICE ,
SPECIAL_LOGGER_SOCKET ,
2010-01-28 04:43:52 +03:00
SPECIAL_CTRL_ALT_DEL_TARGET ,
SPECIAL_KBREQUEST_TARGET ,
2010-01-28 04:01:15 +03:00
_SPECIAL_UNIT_MAX
} SpecialUnit ;
2009-11-18 02:42:52 +03:00
struct Manager {
uint32_t current_job_id ;
2010-01-26 23:39:06 +03:00
/* Note that the set of units we know of is allowed to be
2010-01-19 01:50:13 +03:00
* incosistent . However the subset of it that is loaded may
* not , and the list of jobs may neither . */
2010-01-26 23:39:06 +03:00
/* Active jobs and units */
Hashmap * units ; /* name string => Unit object n:1 */
2009-11-18 02:42:52 +03:00
Hashmap * jobs ; /* job id => Job object 1:1 */
2010-01-26 23:39:06 +03:00
/* Units that need to be loaded */
2009-11-18 02:42:52 +03:00
LIST_HEAD ( Meta , load_queue ) ; /* this is actually more a stack than a queue, but uh. */
2010-01-26 06:18:44 +03:00
/* Jobs that need to be run */
LIST_HEAD ( Job , run_queue ) ; /* more a stack than a queue, too */
2010-01-20 04:12:51 +03:00
/* Jobs to be added */
2010-01-26 23:39:06 +03:00
Hashmap * transaction_jobs ; /* Unit object => Job object list 1:1 */
2010-01-20 04:12:51 +03:00
JobDependency * transaction_anchor ;
2009-11-19 04:52:17 +03:00
bool dispatching_load_queue : 1 ;
2010-01-26 06:18:44 +03:00
bool dispatching_run_queue : 1 ;
2010-01-23 03:52:57 +03:00
2010-01-26 23:39:06 +03:00
Hashmap * watch_pids ; /* pid => Unit object n:1 */
2010-01-24 02:39:29 +03:00
int epoll_fd ;
2010-01-27 06:31:52 +03:00
Watch signal_watch ;
2010-01-28 04:01:15 +03:00
Unit * special_units [ _SPECIAL_UNIT_MAX ] ; /* some special units */
2009-11-18 02:42:52 +03:00
} ;
Manager * manager_new ( void ) ;
void manager_free ( Manager * m ) ;
Job * manager_get_job ( Manager * m , uint32_t id ) ;
2010-01-26 23:39:06 +03:00
Unit * manager_get_unit ( Manager * m , const char * name ) ;
2009-11-18 02:42:52 +03:00
2010-01-27 02:15:56 +03:00
int manager_load_unit ( Manager * m , const char * path_or_name , Unit * * _ret ) ;
2010-01-26 23:39:06 +03:00
int manager_add_job ( Manager * m , JobType type , Unit * unit , JobMode mode , bool force , Job * * _ret ) ;
2009-11-18 02:42:52 +03:00
2010-01-26 23:39:06 +03:00
void manager_dump_units ( Manager * s , FILE * f , const char * prefix ) ;
2010-01-20 06:02:39 +03:00
void manager_dump_jobs ( Manager * s , FILE * f , const char * prefix ) ;
2010-01-19 02:22:34 +03:00
2010-01-20 22:47:49 +03:00
void manager_transaction_unlink_job ( Manager * m , Job * j ) ;
2010-01-20 04:12:51 +03:00
2010-01-20 07:03:52 +03:00
void manager_clear_jobs ( Manager * m ) ;
2010-01-26 06:18:44 +03:00
void manager_dispatch_run_queue ( Manager * m ) ;
2010-01-24 02:39:29 +03:00
int manager_loop ( Manager * m ) ;
2010-01-24 00:56:47 +03:00
2009-11-18 02:42:52 +03:00
# endif