X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmanager.c;h=8a9b9dd44edf9f98e070d4adca09af1a334499b2;hb=36adffeab07c74470bc96417b17a72b53055ee42;hp=cdcd6935cdfe5e6d5b3483b5d82d3437781db114;hpb=9f611ad82e1eb1a9885f07ac95c244b25a7fbac7;p=elogind.git diff --git a/src/manager.c b/src/manager.c index cdcd6935c..8a9b9dd44 100644 --- a/src/manager.c +++ b/src/manager.c @@ -1124,6 +1124,7 @@ static int transaction_apply(Manager *m) { job_add_to_run_queue(j); job_add_to_dbus_queue(j); + job_start_timer(j); } /* As last step, kill all remaining job dependencies. */ @@ -1328,7 +1329,8 @@ static int transaction_add_job_and_dependencies( assert(type < _JOB_TYPE_MAX); assert(unit); - if (unit->meta.load_state != UNIT_LOADED) { + if (type != JOB_STOP && + unit->meta.load_state != UNIT_LOADED) { dbus_set_error(e, BUS_ERROR_LOAD_FAILED, "Unit %s failed to load. See logs for details.", unit->meta.id); return -EINVAL; } @@ -2021,7 +2023,8 @@ static int process_event(Manager *m, struct epoll_event *ev) { UNIT_VTABLE(w->data.unit)->fd_event(w->data.unit, w->fd, ev->events, w); break; - case WATCH_TIMER: { + case WATCH_UNIT_TIMER: + case WATCH_JOB_TIMER: { uint64_t v; ssize_t k; @@ -2034,7 +2037,10 @@ static int process_event(Manager *m, struct epoll_event *ev) { return k < 0 ? -errno : -EIO; } - UNIT_VTABLE(w->data.unit)->timer_event(w->data.unit, v, w); + if (w->type == WATCH_UNIT_TIMER) + UNIT_VTABLE(w->data.unit)->timer_event(w->data.unit, v, w); + else + job_timer_event(w->data.job, v, w); break; } @@ -2460,6 +2466,16 @@ bool manager_is_booting_or_shutting_down(Manager *m) { return false; } +void manager_reset_maintenance(Manager *m) { + Unit *u; + Iterator i; + + assert(m); + + HASHMAP_FOREACH(u, m->units, i) + unit_reset_maintenance(u); +} + static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = { [MANAGER_SYSTEM] = "system", [MANAGER_SESSION] = "session"