#include "load-fragment.h"
#include "load-dropin.h"
#include "log.h"
+#include "dbus-job.h"
Job* job_new(Manager *m, JobType type, Unit *unit) {
Job *j;
if (j->installed) {
bus_job_send_removed_signal(j);
- if (j->unit->meta.job == j)
+ if (j->unit->meta.job == j) {
j->unit->meta.job = NULL;
+ unit_add_to_gc_queue(j->unit);
+ }
hashmap_remove(j->manager->jobs, UINT32_TO_PTR(j->id));
j->installed = false;
}
/* Detach from next 'smaller' objects */
- manager_transaction_unlink_job(j->manager, j);
+ manager_transaction_unlink_job(j->manager, j, true);
if (j->in_run_queue)
LIST_REMOVE(Job, run_queue, j->manager->run_queue, j);
assert(f);
fprintf(f,
- "%s→ Job %u:\n"
- "%s\tAction: %s → %s\n"
+ "%s-> Job %u:\n"
+ "%s\tAction: %s -> %s\n"
"%s\tState: %s\n"
"%s\tForced: %s\n",
prefix, j->id,
- prefix, unit_id(j->unit), job_type_to_string(j->type),
+ prefix, j->unit->meta.id, job_type_to_string(j->type),
prefix, job_state_to_string(j->state),
- prefix, yes_no(j->forced));
+ prefix, yes_no(j->override));
}
bool job_is_anchor(Job *j) {
assert(j);
assert(j->installed);
- log_debug("Job %s/%s finished, success=%s", unit_id(j->unit), job_type_to_string(j->type), yes_no(success));
+ log_debug("Job %s/%s finished, success=%s", j->unit->meta.id, job_type_to_string(j->type), yes_no(success));
job_add_to_dbus_queue(j);
/* Patch restart jobs so that they become normal start jobs */
if (success && (j->type == JOB_RESTART || j->type == JOB_TRY_RESTART)) {
- log_debug("Converting job %s/%s → %s/%s",
- unit_id(j->unit), job_type_to_string(j->type),
- unit_id(j->unit), job_type_to_string(JOB_START));
+ log_debug("Converting job %s/%s -> %s/%s",
+ j->unit->meta.id, job_type_to_string(j->type),
+ j->unit->meta.id, job_type_to_string(JOB_START));
j->state = JOB_RUNNING;
j->type = JOB_START;
SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRED_BY], i)
if (other->meta.job &&
- (other->meta.type == JOB_START ||
- other->meta.type == JOB_VERIFY_ACTIVE ||
- other->meta.type == JOB_RELOAD_OR_START))
+ (other->meta.job->type == JOB_START ||
+ other->meta.job->type == JOB_VERIFY_ACTIVE ||
+ other->meta.job->type == JOB_RELOAD_OR_START))
job_finish_and_invalidate(other->meta.job, false);
- SET_FOREACH(other, u->meta.dependencies[UNIT_SOFT_REQUIRED_BY], i)
+ SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
if (other->meta.job &&
- !other->meta.job->forced &&
- (other->meta.type == JOB_START ||
- other->meta.type == JOB_VERIFY_ACTIVE ||
- other->meta.type == JOB_RELOAD_OR_START))
+ !other->meta.job->override &&
+ (other->meta.job->type == JOB_START ||
+ other->meta.job->type == JOB_VERIFY_ACTIVE ||
+ other->meta.job->type == JOB_RELOAD_OR_START))
job_finish_and_invalidate(other->meta.job, false);
} else if (t == JOB_STOP) {
SET_FOREACH(other, u->meta.dependencies[UNIT_CONFLICTS], i)
if (other->meta.job &&
- (t == JOB_START ||
- t == JOB_VERIFY_ACTIVE ||
- t == JOB_RELOAD_OR_START))
+ (other->meta.job->type == JOB_START ||
+ other->meta.job->type == JOB_VERIFY_ACTIVE ||
+ other->meta.job->type == JOB_RELOAD_OR_START))
job_finish_and_invalidate(other->meta.job, false);
}
}
static const char* const job_mode_table[_JOB_MODE_MAX] = {
[JOB_FAIL] = "fail",
- [JOB_REPLACE] = "replace"
+ [JOB_REPLACE] = "replace",
+ [JOB_ISOLATE] = "isolate"
};
DEFINE_STRING_TABLE_LOOKUP(job_mode, JobMode);