X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmanager.c;h=e19bacfa749ddf2e9e7dd7dd95f32e31d8fedd32;hb=f4579ce704b9db0358b90c282da9536410a4df5a;hp=e211ecaf56c3851fb63268e3c8c4e4a2e7c125ab;hpb=a3d4e06dfa234bf2a9398c8e534b705b68aa50a1;p=elogind.git diff --git a/src/manager.c b/src/manager.c index e211ecaf5..e19bacfa7 100644 --- a/src/manager.c +++ b/src/manager.c @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -183,7 +182,7 @@ static int manager_setup_signals(Manager *m) { return 0; } -int manager_new(ManagerRunningAs running_as, bool confirm_spawn, Manager **_m) { +int manager_new(ManagerRunningAs running_as, Manager **_m) { Manager *m; int r = -ENOMEM; char *p; @@ -195,11 +194,10 @@ int manager_new(ManagerRunningAs running_as, bool confirm_spawn, Manager **_m) { if (!(m = new0(Manager, 1))) return -ENOMEM; - timestamp_get(&m->startup_timestamp); + dual_timestamp_get(&m->startup_timestamp); m->running_as = running_as; - m->confirm_spawn = confirm_spawn; - m->name_data_slot = -1; + m->name_data_slot = m->subscribed_data_slot = -1; m->exit_code = _MANAGER_EXIT_CODE_INVALID; m->pin_cgroupfs_fd = -1; @@ -271,7 +269,7 @@ static unsigned manager_dispatch_cleanup_queue(Manager *m) { while ((meta = m->cleanup_queue)) { assert(meta->in_cleanup_queue); - unit_free(UNIT(meta)); + unit_free((Unit*) meta); n++; } @@ -361,7 +359,7 @@ static unsigned manager_dispatch_gc_queue(Manager *m) { while ((meta = m->gc_queue)) { assert(meta->in_gc_queue); - unit_gc_sweep(UNIT(meta), gc_marker); + unit_gc_sweep((Unit*) meta, gc_marker); LIST_REMOVE(Meta, gc_queue, m->gc_queue, meta); meta->in_gc_queue = false; @@ -372,7 +370,7 @@ static unsigned manager_dispatch_gc_queue(Manager *m) { meta->gc_marker == gc_marker + GC_OFFSET_UNSURE) { log_debug("Collecting %s", meta->id); meta->gc_marker = gc_marker + GC_OFFSET_BAD; - unit_add_to_cleanup_queue(UNIT(meta)); + unit_add_to_cleanup_queue((Unit*) meta); } } @@ -421,7 +419,8 @@ void manager_free(Manager *m) { /* If we reexecute ourselves, we keep the root cgroup * around */ - manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE); + if (m->exit_code != MANAGER_REEXECUTE) + manager_shutdown_cgroup(m); bus_done(m); @@ -1343,7 +1342,7 @@ static int transaction_add_isolate_jobs(Manager *m) { continue; /* No need to stop inactive jobs */ - if (unit_active_state(u) == UNIT_INACTIVE) + if (UNIT_IS_INACTIVE_OR_MAINTENANCE(unit_active_state(u))) continue; /* Is there already something listed for this? */ @@ -1439,7 +1438,7 @@ unsigned manager_dispatch_load_queue(Manager *m) { while ((meta = m->load_queue)) { assert(meta->in_load_queue); - unit_load(UNIT(meta)); + unit_load((Unit*) meta); n++; } @@ -1585,7 +1584,7 @@ unsigned manager_dispatch_dbus_queue(Manager *m) { while ((meta = m->dbus_unit_queue)) { assert(meta->in_dbus_queue); - bus_unit_send_change_signal(UNIT(meta)); + bus_unit_send_change_signal((Unit*) meta); n++; } @@ -1701,7 +1700,7 @@ static int manager_dispatch_sigchld(Manager *m) { char *name = NULL; get_process_name(si.si_pid, &name); - log_debug("Got SIGCHLD for process %llu (%s)", (unsigned long long) si.si_pid, strna(name)); + log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si.si_pid, strna(name)); free(name); } @@ -1727,8 +1726,8 @@ static int manager_dispatch_sigchld(Manager *m) { if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED) continue; - log_debug("Child %llu died (code=%s, status=%i/%s)", - (long long unsigned) si.si_pid, + log_debug("Child %lu died (code=%s, status=%i/%s)", + (long unsigned) si.si_pid, sigchld_code_to_string(si.si_code), si.si_status, strna(si.si_code == CLD_EXITED ? exit_status_to_string(si.si_status) : strsignal(si.si_status))); @@ -1879,7 +1878,7 @@ static int manager_process_signal_fd(Manager *m) { if ((int) sfsi.ssi_signo >= SIGRTMIN+0 && (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(table)) { manager_start_target(m, table[sfsi.ssi_signo - SIGRTMIN], - sfsi.ssi_signo == 2 ? JOB_ISOLATE : JOB_REPLACE); + (sfsi.ssi_signo == 1 || sfsi.ssi_signo == 2) ? JOB_ISOLATE : JOB_REPLACE); break; } @@ -2336,6 +2335,22 @@ finish: return r; } +bool manager_is_booting_or_shutting_down(Manager *m) { + Unit *u; + + assert(m); + + /* Is the initial job still around? */ + if (manager_get_job(m, 1)) + return true; + + /* Is there a job for the shutdown target? */ + if (((u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET)))) + return !!u->meta.job; + + return false; +} + static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = { [MANAGER_SYSTEM] = "system", [MANAGER_SESSION] = "session"