X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fjob.c;h=e5dcef7cf43d9f616665072f4e675028ecc711b3;hb=eb9da376d76b48585b3b63b4f91903b54f7abd36;hp=af5855b71d6a9c840c94b7cef7e55ee40d877c95;hpb=b92bea5d2a9481de69bb627a7b442a9f58fca43d;p=elogind.git diff --git a/src/core/job.c b/src/core/job.c index af5855b71..e5dcef7cf 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -35,7 +35,7 @@ #include "log.h" #include "dbus-job.h" #include "special.h" -#include "sync.h" +#include "async.h" #include "virt.h" JobBusClient* job_bus_client_new(DBusConnection *connection, const char *name) { @@ -99,10 +99,10 @@ void job_free(Job *j) { assert(!j->object_list); if (j->in_run_queue) - LIST_REMOVE(Job, run_queue, j->manager->run_queue, j); + LIST_REMOVE(run_queue, j->manager->run_queue, j); if (j->in_dbus_queue) - LIST_REMOVE(Job, dbus_queue, j->manager->dbus_job_queue, j); + LIST_REMOVE(dbus_queue, j->manager->dbus_job_queue, j); if (j->timer_watch.type != WATCH_INVALID) { assert(j->timer_watch.type == WATCH_JOB_TIMER); @@ -114,7 +114,7 @@ void job_free(Job *j) { } while ((cl = j->bus_client_list)) { - LIST_REMOVE(JobBusClient, client, j->bus_client_list, cl); + LIST_REMOVE(client, j->bus_client_list, cl); free(cl); } free(j); @@ -267,9 +267,9 @@ JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool l->conflicts = conflicts; if (subject) - LIST_PREPEND(JobDependency, subject, subject->subject_list, l); + LIST_PREPEND(subject, subject->subject_list, l); - LIST_PREPEND(JobDependency, object, object->object_list, l); + LIST_PREPEND(object, object->object_list, l); return l; } @@ -278,9 +278,9 @@ void job_dependency_free(JobDependency *l) { assert(l); if (l->subject) - LIST_REMOVE(JobDependency, subject, l->subject->subject_list, l); + LIST_REMOVE(subject, l->subject->subject_list, l); - LIST_REMOVE(JobDependency, object, l->object->object_list, l); + LIST_REMOVE(object, l->object->object_list, l); free(l); } @@ -491,7 +491,7 @@ int job_run_and_invalidate(Job *j) { assert(j->type < _JOB_TYPE_MAX_IN_TRANSACTION); assert(j->in_run_queue); - LIST_REMOVE(Job, run_queue, j->manager->run_queue, j); + LIST_REMOVE(run_queue, j->manager->run_queue, j); j->in_run_queue = false; if (j->state != JOB_WAITING) @@ -569,7 +569,7 @@ int job_run_and_invalidate(Job *j) { return r; } -static const char *job_get_status_message_format(Unit *u, JobType t, JobResult result) { +_pure_ static const char *job_get_status_message_format(Unit *u, JobType t, JobResult result) { const UnitStatusMessageFormats *format_table; assert(u); @@ -588,7 +588,7 @@ static const char *job_get_status_message_format(Unit *u, JobType t, JobResult r return NULL; } -static const char *job_get_status_message_format_try_harder(Unit *u, JobType t, JobResult result) { +_pure_ static const char *job_get_status_message_format_try_harder(Unit *u, JobType t, JobResult result) { const char *format; assert(u); @@ -840,9 +840,11 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) { job_result_to_string(result), NULL); - unit_trigger_on_failure(u); + unit_start_on_failure(u); } + unit_trigger_notify(u); + finish: /* Try to start the next jobs that can be started */ SET_FOREACH(other, u->dependencies[UNIT_AFTER], i) @@ -908,7 +910,7 @@ void job_add_to_run_queue(Job *j) { if (j->in_run_queue) return; - LIST_PREPEND(Job, run_queue, j->manager->run_queue, j); + LIST_PREPEND(run_queue, j->manager->run_queue, j); j->in_run_queue = true; } @@ -923,7 +925,7 @@ void job_add_to_dbus_queue(Job *j) { * job might just have been created and not yet assigned to a * connection/client. */ - LIST_PREPEND(Job, dbus_queue, j->manager->dbus_job_queue, j); + LIST_PREPEND(dbus_queue, j->manager->dbus_job_queue, j); j->in_dbus_queue = true; } @@ -1086,10 +1088,13 @@ void job_shutdown_magic(Job *j) { * asynchronous sync() would cause their exit to be * delayed. */ - if (!unit_has_name(j->unit, SPECIAL_SHUTDOWN_TARGET)) + if (j->type != JOB_START) return; - if (j->type != JOB_START) + if (j->unit->manager->running_as != SYSTEMD_SYSTEM) + return; + + if (!unit_has_name(j->unit, SPECIAL_SHUTDOWN_TARGET)) return; if (detect_container(NULL) > 0)