aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--include/jobs.h15
-rw-r--r--include/util.h7
-rw-r--r--src/jobs.c89
4 files changed, 84 insertions, 28 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cf8ac42
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+vgcore.*
diff --git a/include/jobs.h b/include/jobs.h
index 3a1fb19..d223ec2 100644
--- a/include/jobs.h
+++ b/include/jobs.h
@@ -3,23 +3,22 @@
#ifndef JOBS_H
-LIST_HEAD(output_dlist, output);
struct output {
char *name, *store_path;
- LIST_ENTRY(output) dlist;
};
-LIST_HEAD(job_dlist, job);
-CIRCLEQ_HEAD(job_clist, job);
struct job {
char *name, *drv_path;
- struct output_dlist outputs;
- struct job_dlist deps;
- /* TODO: replace dlist with clist jobs.c */
- LIST_ENTRY(job) dlist;
+ size_t outputs_size, outputs_filled;
+ struct output **outputs;
+
+ size_t deps_size, deps_filled;
+ struct job **deps;
+
CIRCLEQ_ENTRY(job) clist;
};
+CIRCLEQ_HEAD(job_clist, job);
typedef enum {
JOB_READ_SUCCESS = 0,
diff --git a/include/util.h b/include/util.h
index 5279a07..130bbdd 100644
--- a/include/util.h
+++ b/include/util.h
@@ -5,13 +5,6 @@
#define print_err(fmt, ...) \
fprintf(stderr, "[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)
-#define LIST_FOREACH_FREE(cur, next, head, field, func_free) \
- for ((cur) = ((head)->lh_first); (cur);) { \
- (next) = ((cur)->field.le_next); \
- func_free((cur)); \
- (cur) = (next); \
- }
-
#define CIRCLEQ_FOREACH_FREE(cur, next, head, field, func_free) \
for ((cur) = ((head)->cqh_first); (cur) != (const void *)(head);) { \
(next) = ((cur)->field.cqe_next); \
diff --git a/src/jobs.c b/src/jobs.c
index 2a556b5..85ecb8e 100644
--- a/src/jobs.c
+++ b/src/jobs.c
@@ -12,6 +12,8 @@ static void output_free(struct output *output);
static int job_output_insert(struct job *j, char *name, char *store_path);
static int job_read_inputdrvs(struct job *job, cJSON *input_drvs);
static int job_read_outputs(struct job *job, cJSON *outputs);
+static int job_deps_list_insert(struct job *job, struct job *dep);
+static int job_output_list_insert(struct job *job, struct output *output);
static void output_free(struct output *output)
{
@@ -24,6 +26,54 @@ static void output_free(struct output *output)
free(output);
}
+static int job_output_list_insert(struct job *job, struct output *output)
+{
+ size_t newsize = 0;
+ void *ret;
+
+ if (job->outputs_filled < job->outputs_size) {
+ job->outputs[job->outputs_filled++] = output;
+ return 0;
+ }
+
+ newsize = job->outputs_size == 0 ? 1 : job->outputs_size * 2;
+ ret = realloc(job->outputs, newsize * sizeof(*job->outputs));
+ if (ret == NULL) {
+ print_err("%s", strerror(errno));
+ return -errno;
+ }
+
+ job->outputs = ret;
+ job->outputs_size = newsize;
+ job->outputs[job->outputs_filled++] = output;
+
+ return 0;
+}
+
+static int job_deps_list_insert(struct job *job, struct job *dep)
+{
+ size_t newsize = 0;
+ void *ret;
+
+ if (job->deps_filled < job->deps_size) {
+ job->deps[job->deps_filled++] = dep;
+ return 0;
+ }
+
+ newsize = job->deps_size == 0 ? 1 : job->deps_size * 2;
+ ret = realloc(job->deps, newsize * sizeof(*job->deps));
+ if (ret == NULL) {
+ print_err("%s", strerror(errno));
+ return -errno;
+ }
+
+ job->deps = ret;
+ job->deps_size = newsize;
+ job->deps[job->deps_filled++] = dep;
+
+ return 0;
+}
+
static int job_output_insert(struct job *j, char *name, char *store_path)
{
struct output *o;
@@ -52,14 +102,19 @@ static int job_output_insert(struct job *j, char *name, char *store_path)
o->store_path = NULL;
}
+ ret = job_output_list_insert(j, o);
+ if (ret < 0)
+ goto out_free_store_path;
+
+out_free_store_path:
+ if (ret < 0)
+ free(o->store_path);
out_free_name:
if (ret < 0)
free(o->name);
out_free_o:
if (ret < 0)
free(o);
- else
- LIST_INSERT_HEAD(&j->outputs, o, dlist);
return 0;
}
@@ -78,13 +133,14 @@ static int job_read_inputdrvs(struct job *job, cJSON *input_drvs)
cJSON_ArrayForEach (output, array) {
ret = job_output_insert(dep_job, output->valuestring, NULL);
- if (ret < 0) {
+ if (ret < 0)
job_free(dep_job);
- goto out_free_dep_job;
- }
}
- LIST_INSERT_HEAD(&job->deps, dep_job, dlist);
+ ret = job_deps_list_insert(job, dep_job);
+ if (ret < 0)
+ job_free(dep_job);
+
dep_job = NULL;
}
@@ -180,17 +236,19 @@ out_free:
void job_free(struct job *job)
{
- struct job *job_cur, *job_next;
- struct output *op_cur, *op_next;
-
if (job == NULL)
return;
free(job->name);
free(job->drv_path);
- LIST_FOREACH_FREE(op_cur, op_next, &job->outputs, dlist, output_free);
- LIST_FOREACH_FREE(job_cur, job_next, &job->deps, dlist, job_free);
+ for (size_t i = 0; i < job->outputs_filled; i++)
+ output_free(job->outputs[i]);
+ free(job->outputs);
+
+ for (size_t i = 0; i < job->deps_filled; i++)
+ job_free(job->deps[i]);
+ free(job->deps);
free(job);
}
@@ -224,8 +282,13 @@ int job_new(struct job **j, char *name, char *drv_path)
goto out_free_name;
}
- LIST_INIT(&job->deps);
- LIST_INIT(&job->outputs);
+ job->outputs_size = 0;
+ job->outputs_filled = 0;
+ job->outputs = NULL;
+
+ job->deps_size = 0;
+ job->deps_filled = 0;
+ job->deps = NULL;
out_free_name:
if (ret < 0)