X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fjob.c;h=2bafbc15894b9a636b6d762698758aa5b8c05c41;hb=c65eb8365344eeb72ee2c0b333ab54d925263b3f;hp=6a03d17aa83b62f5e4da9b66c05c6cdae49ce431;hpb=e45460d666512db4f908f86e8722d7932dcf0f82;p=elogind.git diff --git a/src/core/job.c b/src/core/job.c index 6a03d17aa..2bafbc158 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -34,6 +34,9 @@ #include "load-dropin.h" #include "log.h" #include "dbus-job.h" +#include "special.h" +#include "sync.h" +#include "virt.h" JobBusClient* job_bus_client_new(DBusConnection *connection, const char *name) { JobBusClient *cl; @@ -1061,6 +1064,29 @@ int job_coldplug(Job *j) { return 0; } +void job_shutdown_magic(Job *j) { + assert(j); + + /* The shutdown target gets some special treatment here: we + * tell the kernel to begin with flushing its disk caches, to + * optimize shutdown time a bit. Ideally we wouldn't hardcode + * this magic into PID 1. However all other processes aren't + * options either since they'd exit much sooner than PID 1 and + * asynchronous sync() would cause their exit to be + * delayed. */ + + if (!unit_has_name(j->unit, SPECIAL_SHUTDOWN_TARGET)) + return; + + if (j->type != JOB_START) + return; + + if (detect_container(NULL) > 0) + return; + + asynchronous_sync(); +} + static const char* const job_state_table[_JOB_STATE_MAX] = { [JOB_WAITING] = "waiting", [JOB_RUNNING] = "running"