diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-06-03 14:26:50 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-06-03 14:27:02 +0200 |
commit | cca098b09535f58c638ed41310be60504be49bc4 (patch) | |
tree | 2edbf85ba3e103434dec0760ac393c6bc8687bd4 /src | |
parent | a4ddf82766c41627bd94c609bb55983f4b81814f (diff) |
unit: serialize jobs in addition to units
Diffstat (limited to 'src')
-rw-r--r-- | src/manager.c | 5 | ||||
-rw-r--r-- | src/unit.c | 34 | ||||
-rw-r--r-- | src/unit.h | 6 |
3 files changed, 42 insertions, 3 deletions
diff --git a/src/manager.c b/src/manager.c index a71150d..28bc4c3 100644 --- a/src/manager.c +++ b/src/manager.c @@ -625,9 +625,8 @@ int manager_coldplug(Manager *m) { if (u->meta.id != k) continue; - if (UNIT_VTABLE(u)->coldplug) - if ((q = UNIT_VTABLE(u)->coldplug(u)) < 0) - r = q; + if ((q = unit_coldplug(u)) < 0) + r = q; } return r; @@ -67,6 +67,7 @@ Unit *unit_new(Manager *m) { u->meta.manager = m; u->meta.type = _UNIT_TYPE_INVALID; + u->meta.deserialized_job = _JOB_TYPE_INVALID; return u; } @@ -1794,6 +1795,9 @@ int unit_serialize(Unit *u, FILE *f, FDSet *fds) { if ((r = UNIT_VTABLE(u)->serialize(u, f, fds)) < 0) return r; + if (u->meta.job) + unit_serialize_item(u, f, "job", job_type_to_string(u->meta.job->type)); + /* End marker */ fputc('\n', f); return 0; @@ -1860,6 +1864,17 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) { } else v = l+k; + if (streq(l, "job")) { + JobType type; + + if ((type = job_type_from_string(v)) < 0) + log_debug("Failed to parse job type value %s", v); + else + u->meta.deserialized_job = type; + + continue; + } + if ((r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds)) < 0) return r; } @@ -1902,6 +1917,25 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) { return 0; } +int unit_coldplug(Unit *u) { + int r; + + assert(u); + + if (UNIT_VTABLE(u)->coldplug) + if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0) + return r; + + if (u->meta.deserialized_job >= 0) { + if ((r = manager_add_job(u->meta.manager, u->meta.deserialized_job, u, JOB_FAIL, false, NULL)) < 0) + return r; + + u->meta.deserialized_job = _JOB_TYPE_INVALID; + } + + return 0; +} + static const char* const unit_type_table[_UNIT_TYPE_MAX] = { [UNIT_SERVICE] = "service", [UNIT_TIMER] = "timer", @@ -185,6 +185,10 @@ struct Meta { /* Garbage collect us we nobody wants or requires us anymore */ bool stop_when_unneeded; + /* When deserializing, temporarily store the job type for this + * unit here, if there was a job scheduled */ + JobType deserialized_job; + bool in_load_queue:1; bool in_dbus_queue:1; bool in_cleanup_queue:1; @@ -437,6 +441,8 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds); int unit_add_node_link(Unit *u, const char *what, bool wants); +int unit_coldplug(Unit *u); + const char *unit_type_to_string(UnitType i); UnitType unit_type_from_string(const char *s); |