job: allow job_free() only on already unlinked jobs

job_free() is IMO too helpful when it unlinks the job from the transaction.
The callers should ensure the job is already unlinked before freeing.
The added assertions check if anyone gets it wrong.
This commit is contained in:
Michal Schmidt 2012-04-19 23:20:34 +02:00
parent 153bda8f03
commit 02a3bcc6b4
3 changed files with 12 additions and 7 deletions

View file

@ -71,8 +71,10 @@ void job_free(Job *j) {
j->installed = false;
}
/* Detach from next 'smaller' objects */
manager_transaction_unlink_job(j->manager, j, true);
assert(!j->transaction_prev);
assert(!j->transaction_next);
assert(!j->subject_list);
assert(!j->object_list);
if (j->in_run_queue)
LIST_REMOVE(Job, run_queue, j->manager->run_queue, j);

View file

@ -662,13 +662,15 @@ int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
return r;
}
static void transaction_unlink_job(Manager *m, Job *j, bool delete_dependencies);
static void transaction_delete_job(Manager *m, Job *j, bool delete_dependencies) {
assert(m);
assert(j);
/* Deletes one job from the transaction */
manager_transaction_unlink_job(m, j, delete_dependencies);
transaction_unlink_job(m, j, delete_dependencies);
if (!j->installed)
job_free(j);
@ -710,8 +712,10 @@ static void transaction_abort(Manager *m) {
while ((j = hashmap_first(m->transaction_jobs)))
if (j->installed)
transaction_delete_job(m, j, true);
else
else {
transaction_unlink_job(m, j, true);
job_free(j);
}
assert(hashmap_isempty(m->transaction_jobs));
@ -1441,6 +1445,7 @@ static Job* transaction_add_one_job(Manager *m, JobType type, Unit *unit, bool o
LIST_PREPEND(Job, transaction, f, j);
if (hashmap_replace(m->transaction_jobs, unit, f) < 0) {
LIST_REMOVE(Job, transaction, f, j);
job_free(j);
return NULL;
}
@ -1453,7 +1458,7 @@ static Job* transaction_add_one_job(Manager *m, JobType type, Unit *unit, bool o
return j;
}
void manager_transaction_unlink_job(Manager *m, Job *j, bool delete_dependencies) {
static void transaction_unlink_job(Manager *m, Job *j, bool delete_dependencies) {
assert(m);
assert(j);

View file

@ -257,8 +257,6 @@ int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode
void manager_dump_units(Manager *s, FILE *f, const char *prefix);
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
void manager_transaction_unlink_job(Manager *m, Job *j, bool delete_dependencies);
void manager_clear_jobs(Manager *m);
unsigned manager_dispatch_load_queue(Manager *m);