aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jobs.c1
-rw-r--r--src/queue.c25
2 files changed, 26 insertions, 0 deletions
diff --git a/src/jobs.c b/src/jobs.c
index 95566cb..aeac2fa 100644
--- a/src/jobs.c
+++ b/src/jobs.c
@@ -370,6 +370,7 @@ static int job_new(struct job **j, char *name, char *drv_path, char *attr,
job->scheduled = false;
job->stale = false;
job->id = -1;
+ job->age = 0;
job->outputs_size = 0;
job->outputs_filled = 0;
diff --git a/src/queue.c b/src/queue.c
index 655822e..148ca9a 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -51,6 +51,30 @@ static int queue_dag_isolate(struct job *job, struct job *keep_parent,
return 0;
}
+/* remove a node along with all it's ancestors recursively */
+int queue_ancestors_rm(struct job *job, struct job_clist *jobs,
+ struct htab *htab)
+{
+ struct job *j;
+ int ret;
+
+ job_stale_set(job);
+ CIRCLEQ_FOREACH(j, jobs, clist) {
+ if (j->stale == false)
+ continue;
+
+ ret = queue_dag_isolate(j, NULL, jobs, htab);
+ if (ret < 0)
+ return ret;
+
+ job_free(j);
+ /* we might have removed j->clist.cqe_next */
+ j = jobs->cqh_last;
+ }
+
+ return 0;
+}
+
void *queue_thread_entry(void *queue_thread)
{
struct queue_thread *qt = queue_thread;
@@ -221,6 +245,7 @@ int queue_thread_new(struct queue_thread **queue_thread, FILE *stream)
ret = -errno;
goto out_free_qt;
}
+ qt->queue->age = 0;
qt->queue->jobid = NULL;
qt->queue->state = Q_SEM_WAIT;
ret = sem_init(&qt->queue->sem, 0, 0);