fix JobGraph::run to not busy-wait

This commit is contained in:
Jacob Lifshay 2025-10-27 22:57:12 -07:00
parent 0b82178740
commit 0be9f9ce23
Signed by: programmerjake
SSH key fingerprint: SHA256:HnFTLGpSm4Q4Fj502oCFisjZSoakwEuTsJJMSke63RQ

View file

@ -703,8 +703,12 @@ impl JobGraph {
}
let mut running_jobs = HashMap::default();
let (finished_jobs_sender, finished_jobs_receiver) = mpsc::channel();
let mut next_finished_job = None;
loop {
while let Some(finished_job) = finished_jobs_receiver.try_recv().ok() {
if let Some(finished_job) = next_finished_job
.take()
.or_else(|| finished_jobs_receiver.try_recv().ok())
{
let Some(RunningJob { job, thread }) = running_jobs.remove(&finished_job)
else {
unreachable!();
@ -736,6 +740,7 @@ impl JobGraph {
}
}
}
continue;
}
if let Some(WaitingJobState {
job_node_id,
@ -791,12 +796,15 @@ impl JobGraph {
.expect("failed to spawn thread for job"),
},
);
continue;
}
if running_jobs.is_empty() {
assert!(item_name_to_waiting_jobs_map.is_empty());
assert!(ready_jobs.is_empty());
return Ok(());
}
// nothing to do yet, block to avoid busy waiting
next_finished_job = finished_jobs_receiver.recv().ok();
}
})
}