From: Michal Schmidt Date: Fri, 20 Apr 2012 00:04:01 +0000 (+0200) Subject: job: separate job_install() X-Git-Tag: v183~236 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=05d576f1f77699ea5c2e5ed0e04451b14dfc45a0;p=elogind.git job: separate job_install() Let the jobs install themselves. --- diff --git a/src/core/job.c b/src/core/job.c index aa7cdbff2..0b5088818 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -54,21 +54,6 @@ Job* job_new(Unit *unit, JobType type) { return j; } -void job_uninstall(Job *j) { - assert(j->installed); - /* Detach from next 'bigger' objects */ - - bus_job_send_removed_signal(j); - - if (j->unit->job == j) { - j->unit->job = NULL; - unit_add_to_gc_queue(j->unit); - } - - hashmap_remove(j->manager->jobs, UINT32_TO_PTR(j->id)); - j->installed = false; -} - void job_free(Job *j) { assert(j); assert(!j->installed); @@ -96,6 +81,35 @@ void job_free(Job *j) { free(j); } +void job_uninstall(Job *j) { + assert(j->installed); + /* Detach from next 'bigger' objects */ + + bus_job_send_removed_signal(j); + + if (j->unit->job == j) { + j->unit->job = NULL; + unit_add_to_gc_queue(j->unit); + } + + hashmap_remove(j->manager->jobs, UINT32_TO_PTR(j->id)); + j->installed = false; +} + +void job_install(Job *j) { + Job *uj = j->unit->job; + + if (uj) { + job_uninstall(uj); + job_free(uj); + } + + j->unit->job = j; + j->installed = true; + j->manager->n_installed_jobs ++; + log_debug("Installed new job %s/%s as %u", j->unit->id, job_type_to_string(j->type), (unsigned) j->id); +} + JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts) { JobDependency *l; diff --git a/src/core/job.h b/src/core/job.h index 4e0c7ca81..0110126ce 100644 --- a/src/core/job.h +++ b/src/core/job.h @@ -137,8 +137,9 @@ struct Job { }; Job* job_new(Unit *unit, JobType type); -void job_uninstall(Job *j); void job_free(Job *job); +void job_install(Job *j); +void job_uninstall(Job *j); void job_dump(Job *j, FILE*f, const char *prefix); JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts); diff --git a/src/core/transaction.c b/src/core/transaction.c index 41f7b82fb..d495cbddc 100644 --- a/src/core/transaction.c +++ b/src/core/transaction.c @@ -592,33 +592,19 @@ static int transaction_apply(Transaction *tr, Manager *m, JobMode mode) { } while ((j = hashmap_steal_first(tr->jobs))) { - Job *uj; if (j->installed) { /* log_debug("Skipping already installed job %s/%s as %u", j->unit->id, job_type_to_string(j->type), (unsigned) j->id); */ continue; } - uj = j->unit->job; - if (uj) { - job_uninstall(uj); - job_free(uj); - } - - j->unit->job = j; - j->installed = true; - m->n_installed_jobs ++; - - /* We're fully installed. Now let's free data we don't - * need anymore. */ - /* Clean the job dependencies */ transaction_unlink_job(tr, j, false); + job_install(j); + job_add_to_run_queue(j); job_add_to_dbus_queue(j); job_start_timer(j); - - log_debug("Installed new job %s/%s as %u", j->unit->id, job_type_to_string(j->type), (unsigned) j->id); } return 0;