fix JobGraph::run to not busy-wait #46

Merged
programmerjake merged 1 commit from programmerjake/fayalite:dont-busy-wait into master 2025-10-28 06:03:46 +00:00

View file

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