mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-27 19:17:43 +00:00
Merge pull request #937 from frewsxcv/refactor-timeout
Cleanup logic around `timeout` exit status handling.
This commit is contained in:
commit
6bae2688f3
1 changed files with 4 additions and 10 deletions
|
@ -116,21 +116,15 @@ impl ChildExt for Child {
|
||||||
let mut exitstatus = lock.lock().unwrap();
|
let mut exitstatus = lock.lock().unwrap();
|
||||||
// Condvar::wait_timeout_ms() can wake too soon, in this case wait again
|
// Condvar::wait_timeout_ms() can wake too soon, in this case wait again
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
while exitstatus.is_none() {
|
loop {
|
||||||
|
if let Some(exitstatus) = exitstatus.take() {
|
||||||
|
return exitstatus.map(Some);
|
||||||
|
}
|
||||||
if start.elapsed() >= timeout {
|
if start.elapsed() >= timeout {
|
||||||
return Ok(None)
|
return Ok(None)
|
||||||
}
|
}
|
||||||
let cvar_timeout = timeout - start.elapsed();
|
let cvar_timeout = timeout - start.elapsed();
|
||||||
exitstatus = cvar.wait_timeout(exitstatus, cvar_timeout).unwrap().0;
|
exitstatus = cvar.wait_timeout(exitstatus, cvar_timeout).unwrap().0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Turn Option<Result<ExitStatus>> into Result<Option<ExitStatus>>
|
|
||||||
match exitstatus.take() {
|
|
||||||
Some(r) => match r {
|
|
||||||
Ok(s) => Ok(Some(s)),
|
|
||||||
Err(e) => Err(e),
|
|
||||||
},
|
|
||||||
None => panic!(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue