2009-11-18 02:42:52 +03:00
/*-*- Mode: C; c-basic-offset: 8 -*-*/
# include <assert.h>
# include "macro.h"
# include "job.h"
Job * job_new ( Manager * m , JobType type , Name * name ) {
Job * j ;
assert ( m ) ;
assert ( type < _JOB_TYPE_MAX ) ;
assert ( name ) ;
if ( ! ( j = new0 ( Job , 1 ) ) )
return NULL ;
j - > manager = m ;
j - > id = m - > current_job_id + + ;
j - > type = type ;
j - > name = name ;
2010-01-20 04:12:51 +03:00
/* We don't link it here, that's what job_dependency() is for */
2009-11-18 02:42:52 +03:00
return j ;
}
void job_free ( Job * j ) {
assert ( j ) ;
/* Detach from next 'bigger' objects */
if ( j - > linked ) {
2010-01-19 06:15:20 +03:00
if ( j - > name - > meta . job = = j )
j - > name - > meta . job = NULL ;
2009-11-18 02:42:52 +03:00
hashmap_remove ( j - > manager - > jobs , UINT32_TO_PTR ( j - > id ) ) ;
}
2010-01-20 04:12:51 +03:00
manager_transaction_delete_job ( j - > manager , j ) ;
2009-11-18 02:42:52 +03:00
free ( j ) ;
}
2010-01-19 02:22:34 +03:00
2010-01-20 04:12:51 +03:00
JobDependency * job_dependency_new ( Job * subject , Job * object , bool matters ) {
JobDependency * l ;
assert ( object ) ;
/* Adds a new job link, which encodes that the 'subject' job
* needs the ' object ' job in some way . If ' subject ' is NULL
* this means the ' anchor ' job ( i . e . the one the user
* explcitily asked for ) is the requester . */
2010-01-20 04:35:46 +03:00
if ( ! ( l = new0 ( JobDependency , 1 ) ) )
2010-01-20 04:12:51 +03:00
return NULL ;
l - > subject = subject ;
l - > object = object ;
l - > matters = matters ;
if ( subject ) {
l - > subject_next = subject - > subject_list ;
subject - > subject_list = l ;
} else {
l - > subject_next = object - > manager - > transaction_anchor ;
object - > manager - > transaction_anchor = l ;
}
if ( l - > subject_next )
l - > subject_next - > subject_prev = l ;
l - > subject_prev = NULL ;
if ( ( l - > object_next = object - > object_list ) )
l - > object_next - > object_prev = l ;
l - > object_prev = NULL ;
object - > object_list = l ;
return l ;
}
void job_dependency_free ( JobDependency * l ) {
assert ( l ) ;
if ( l - > subject_prev )
l - > subject_prev - > subject_next = l - > subject_next ;
else if ( l - > subject )
l - > subject - > subject_list = l - > subject_next ;
else
l - > object - > manager - > transaction_anchor = l - > subject_next ;
if ( l - > subject_next )
l - > subject_next - > subject_prev = l - > subject_prev ;
if ( l - > object_prev )
l - > object_prev - > object_next = l - > object_next ;
else
l - > object - > object_list = l - > object_next ;
if ( l - > object_next )
l - > object_next - > object_prev = l - > object_prev ;
free ( l ) ;
}
void job_dependency_delete ( Job * subject , Job * object , bool * matters ) {
JobDependency * l ;
assert ( object ) ;
for ( l = object - > object_list ; l ; l = l - > object_next ) {
assert ( l - > object = = object ) ;
if ( l - > subject = = subject )
break ;
}
if ( ! l ) {
if ( matters )
* matters = false ;
return ;
}
if ( matters )
* matters = l - > matters ;
job_dependency_free ( l ) ;
}
2010-01-20 04:35:46 +03:00
void job_dump ( Job * j , FILE * f , const char * prefix ) {
2010-01-19 02:22:34 +03:00
static const char * const job_type_table [ _JOB_TYPE_MAX ] = {
2010-01-19 04:56:37 +03:00
[ JOB_START ] = " start " ,
[ JOB_STOP ] = " stop " ,
[ JOB_VERIFY_STARTED ] = " verify-started " ,
[ JOB_RELOAD ] = " reload " ,
2010-01-20 04:12:51 +03:00
[ JOB_RELOAD_OR_START ] = " reload-or-start " ,
2010-01-19 04:56:37 +03:00
[ JOB_RESTART ] = " restart " ,
[ JOB_TRY_RESTART ] = " try-restart " ,
2010-01-19 02:22:34 +03:00
} ;
static const char * const job_state_table [ _JOB_STATE_MAX ] = {
2010-01-19 04:56:37 +03:00
[ JOB_WAITING ] = " waiting " ,
[ JOB_RUNNING ] = " running " ,
[ JOB_DONE ] = " done "
2010-01-19 02:22:34 +03:00
} ;
assert ( j ) ;
assert ( f ) ;
2010-01-20 04:35:46 +03:00
fprintf ( f ,
" %sJob %u: \n "
" %s \t Action: %s → %s \n "
" %s \t State: %s \n " ,
prefix , j - > id ,
prefix , name_id ( j - > name ) , job_type_table [ j - > type ] ,
prefix , job_state_table [ j - > state ] ) ;
2010-01-19 02:22:34 +03:00
}
2010-01-20 04:12:51 +03:00
bool job_is_anchor ( Job * j ) {
JobDependency * l ;
assert ( j ) ;
for ( l = j - > object_list ; l ; l = l - > object_next )
if ( ! l - > subject )
return true ;
return false ;
}