split out block_on_waiters

This commit is contained in:
Daiderd Jordan 2020-05-01 21:01:39 +02:00
parent 82e12ebe52
commit 0cef8f4e0d
No known key found for this signature in database
GPG key ID: D02435D05B810C96

View file

@ -122,48 +122,7 @@ impl AsyncCmd {
child_wait(WaitTarget::Child, monitor_tx, child), child_wait(WaitTarget::Child, monitor_tx, child),
); );
let head_waiter = thread::spawn(move || { let head_waiter = thread::spawn(move || block_on_waiters(monitor_rx, waiters));
let mut return_status: Option<Result<ExitStatus, io::Error>> = None;
for (id, interior_result) in monitor_rx.iter() {
match waiters.remove(&id) {
Some(handle) => {
info!("Received notice that {:?} finished", id);
let waiter_result = handle.join();
info!("waiter status: {:?}", waiter_result);
info!("interior status: {:?}", interior_result);
match interior_result {
WaitResult::Thread(t) => {
debug!("thread result: {:?}", t);
}
WaitResult::Process(t) => {
return_status = Some(t);
}
}
}
None => {
error!(
"Received notice that {:?} finished, but it isn't being waited on?",
id
);
}
}
if waiters.is_empty() {
debug!("Closing up the waiter receiver thread, no more waiters.");
break;
}
}
info!(
"Out of the child waiter recv, with {:?} remaining waits",
waiters.len()
);
return_status
});
SpawnedAsyncCmd { SpawnedAsyncCmd {
waiter: head_waiter, waiter: head_waiter,
@ -190,6 +149,52 @@ impl SpawnedAsyncCmd {
} }
} }
fn block_on_waiters(
monitor_rx: mpsc::Receiver<(WaitTarget, WaitResult<()>)>,
mut waiters: HashMap<WaitTarget, thread::JoinHandle<()>>,
) -> Option<Result<ExitStatus, io::Error>> {
let mut status = None;
for (id, interior_result) in monitor_rx.iter() {
match waiters.remove(&id) {
Some(handle) => {
info!("Received notice that {:?} finished", id);
let waiter_result = handle.join();
info!("waiter status: {:?}", waiter_result);
info!("interior status: {:?}", interior_result);
match interior_result {
WaitResult::Thread(t) => {
debug!("thread result: {:?}", t);
}
WaitResult::Process(t) => {
status = Some(t);
}
}
}
None => {
error!(
"Received notice that {:?} finished, but it isn't being waited on?",
id
);
}
}
if waiters.is_empty() {
debug!("Closing up the waiter receiver thread, no more waiters.");
break;
}
}
info!(
"Out of the child waiter recv, with {:?} remaining waits",
waiters.len()
);
status
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::AsyncCmd; use super::AsyncCmd;