X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fmanager.c;h=258b3ca4b77942eda329a7576c81a1f34a005053;hp=68d43ada44f61fa6dc75091bca65703e85dba319;hb=1b562e4604f8833bc21fd251b8bdb45c9c224df4;hpb=b23de6af893c11da4286bc416455cd0926d1532e diff --git a/src/manager.c b/src/manager.c index 68d43ada4..258b3ca4b 100644 --- a/src/manager.c +++ b/src/manager.c @@ -58,6 +58,7 @@ #include "special.h" #include "bus-errors.h" #include "exit-status.h" +#include "sd-daemon.h" /* As soon as 16 units are in our GC queue, make sure to run a gc sweep */ #define GC_QUEUE_ENTRIES_MAX 16 @@ -896,6 +897,9 @@ static int transaction_merge_jobs(Manager *m, DBusError *e) { transaction_merge_and_delete_job(m, j, k, t); } + if (j->unit->meta.job && !j->installed) + transaction_merge_and_delete_job(m, j, j->unit->meta.job, t); + assert(!j->transaction_next); assert(!j->transaction_prev); } @@ -1468,9 +1472,10 @@ static int transaction_add_job_and_dependencies( if (type != JOB_STOP && unit->meta.load_state == UNIT_ERROR) { dbus_set_error(e, BUS_ERROR_LOAD_FAILED, "Unit %s failed to load: %s. " - "See system logs and 'systemctl status' for details.", + "See system logs and 'systemctl status %s' for details.", unit->meta.id, - strerror(-unit->meta.load_error)); + strerror(-unit->meta.load_error), + unit->meta.id); return -EINVAL; } @@ -2259,7 +2264,7 @@ static int process_event(Manager *m, struct epoll_event *ev) { assert(m); assert(ev); - assert(w = ev->data.ptr); + assert_se(w = ev->data.ptr); if (w->type == WATCH_INVALID) return 0; @@ -2898,6 +2903,7 @@ bool manager_unit_pending_inactive(Manager *m, const char *name) { void manager_check_finished(Manager *m) { char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX]; + usec_t kernel_usec = 0, initrd_usec = 0, userspace_usec = 0, total_usec = 0; assert(m); @@ -2911,29 +2917,41 @@ void manager_check_finished(Manager *m) { if (m->running_as == MANAGER_SYSTEM && detect_container(NULL) <= 0) { + userspace_usec = m->finish_timestamp.monotonic - m->startup_timestamp.monotonic; + total_usec = m->finish_timestamp.monotonic; + if (dual_timestamp_is_set(&m->initrd_timestamp)) { + + kernel_usec = m->initrd_timestamp.monotonic; + initrd_usec = m->startup_timestamp.monotonic - m->initrd_timestamp.monotonic; + log_info("Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.", - format_timespan(kernel, sizeof(kernel), - m->initrd_timestamp.monotonic), - format_timespan(initrd, sizeof(initrd), - m->startup_timestamp.monotonic - m->initrd_timestamp.monotonic), - format_timespan(userspace, sizeof(userspace), - m->finish_timestamp.monotonic - m->startup_timestamp.monotonic), - format_timespan(sum, sizeof(sum), - m->finish_timestamp.monotonic)); - } else + format_timespan(kernel, sizeof(kernel), kernel_usec), + format_timespan(initrd, sizeof(initrd), initrd_usec), + format_timespan(userspace, sizeof(userspace), userspace_usec), + format_timespan(sum, sizeof(sum), total_usec)); + } else { + kernel_usec = m->startup_timestamp.monotonic; + initrd_usec = 0; + log_info("Startup finished in %s (kernel) + %s (userspace) = %s.", - format_timespan(kernel, sizeof(kernel), - m->startup_timestamp.monotonic), - format_timespan(userspace, sizeof(userspace), - m->finish_timestamp.monotonic - m->startup_timestamp.monotonic), - format_timespan(sum, sizeof(sum), - m->finish_timestamp.monotonic)); - } else + format_timespan(kernel, sizeof(kernel), kernel_usec), + format_timespan(userspace, sizeof(userspace), userspace_usec), + format_timespan(sum, sizeof(sum), total_usec)); + } + } else { + userspace_usec = initrd_usec = kernel_usec = 0; + total_usec = m->finish_timestamp.monotonic - m->startup_timestamp.monotonic; + log_debug("Startup finished in %s.", - format_timespan(userspace, sizeof(userspace), - m->finish_timestamp.monotonic - m->startup_timestamp.monotonic)); + format_timespan(sum, sizeof(sum), total_usec)); + } + + bus_broadcast_finished(m, kernel_usec, initrd_usec, userspace_usec, total_usec); + sd_notifyf(false, + "READY=1\nSTATUS=Startup finished in %s.", + format_timespan(sum, sizeof(sum), total_usec)); } void manager_run_generators(Manager *m) {