+static void transaction_abort(Manager *m) {
+ Job *j;
+
+ assert(m);
+ assert(m->n_dependency_depth == 0);
+
+ while ((j = hashmap_steal_first(m->jobs_to_add)))
+ job_free(j);
+
+ set_clear(m->jobs_to_remove);
+}
+
+static int transaction_activate(Manager *m) {
+ Job *j;
+ int r;
+ void *state;
+
+ assert(m);
+ assert(m->n_dependency_depth == 0);
+
+ /* This applies the changes recorded in jobs_to_add and
+ * jobs_to_remove to the actual list of jobs */
+
+ HASHMAP_FOREACH(j, m->jobs_to_add, state) {
+ assert(!j->linked);
+
+ if ((r = hashmap_put(j->manager->jobs, UINT32_TO_PTR(j->id), j)) < 0)
+ goto rollback;
+ }
+
+ /* all entries are now registered, now make sure the names
+ * know about that. */
+
+ while ((j = hashmap_steal_first(m->jobs_to_add))) {
+ j->name->meta.job = j;
+ j->linked = true;
+ }
+
+ while ((j = set_steal_first(m->jobs_to_remove)))
+ job_free(j);
+
+ return 0;
+
+rollback:
+
+ HASHMAP_FOREACH(j, m->jobs_to_add, state)
+ hashmap_remove(j->manager->jobs, UINT32_TO_PTR(j->id));
+
+ transaction_abort(m);
+ return r;
+}
+