summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-06-03 14:26:50 +0200
committerLennart Poettering <lennart@poettering.net>2010-06-03 14:27:02 +0200
commitcca098b09535f58c638ed41310be60504be49bc4 (patch)
tree2edbf85ba3e103434dec0760ac393c6bc8687bd4 /src
parenta4ddf82766c41627bd94c609bb55983f4b81814f (diff)
unit: serialize jobs in addition to units
Diffstat (limited to 'src')
-rw-r--r--src/manager.c5
-rw-r--r--src/unit.c34
-rw-r--r--src/unit.h6
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;
diff --git a/src/unit.c b/src/unit.c
index 57b3b77..bb2b8c2 100644
--- a/src/unit.c
+++ b/src/unit.c
@@ -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",
diff --git a/src/unit.h b/src/unit.h
index d3e6e89..fdf1b36 100644
--- a/src/unit.h
+++ b/src/unit.h
@@ -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);