From bf2d66357b9135442f9dec277678b0597abc1d15 Mon Sep 17 00:00:00 2001 From: sinanmohd Date: Sat, 29 Jun 2024 07:21:15 +0530 Subject: solver_util: init --- src/solver_util.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/solver_util.c (limited to 'src/solver_util.c') diff --git a/src/solver_util.c b/src/solver_util.c new file mode 100644 index 0000000..9efb65a --- /dev/null +++ b/src/solver_util.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include + +#include "jobs.h" +#include "solver_util.h" +#include "util.h" + +static int dag_id_assign(struct job *j, struct job_ids *job_ids) +{ + size_t newsize; + void *ret; + + if (j->id >= 0) + return 0; + + for (size_t i = 0; i < j->deps_filled; i++) + return dag_id_assign(j->deps[i], job_ids); + + if (job_ids->size < job_ids->filled) { + j->id = job_ids->filled++; + job_ids->jobs[j->id] = j; + return 0; + } + + newsize = job_ids->size == 0 ? 2 : job_ids->size * 2; + ret = realloc(job_ids->jobs, newsize * sizeof(*job_ids->jobs)); + if (ret == NULL) { + print_err("%s", strerror(errno)); + return -errno; + } + job_ids->jobs = ret; + + j->id = job_ids->filled++; + job_ids->jobs[j->id] = j; + + return 0; +} + +int queue_id_assign(struct job_clist *q, struct job_ids **job_ids) +{ + struct job_ids *ji; + struct job *j; + int ret; + + ji = malloc(sizeof(*ji)); + if (ji == NULL) { + print_err("%s", strerror(errno)); + return -errno; + } + ji->jobs = NULL; + ji->size = 0; + ji->filled = 0; + + CIRCLEQ_FOREACH (j, q, clist) { + ret = dag_id_assign(j, ji); + if (ret < 0) { + goto out_free_js; + } + } + +out_free_js: + if (ret < 0) { + free(ji->jobs); + free(ji); + } else { + *job_ids = ji; + } + + return ret; +} -- cgit v1.2.3