diff options
| author | Jonas Maier <> | 2026-03-11 12:30:07 +0100 |
|---|---|---|
| committer | Jonas Maier <> | 2026-03-11 12:30:07 +0100 |
| commit | 15501132916dfbc24f23b619e6d5408f258fc0d9 (patch) | |
| tree | a77e27bfc139415baf7faf09eeaefec360db9423 /src/wait/thread.rs | |
| parent | b881eec59118bc630b64378476f4d5ada2bf5968 (diff) | |
| download | pish-15501132916dfbc24f23b619e6d5408f258fc0d9.tar.gz | |
can wait for threads & processes with a timeout now
Diffstat (limited to 'src/wait/thread.rs')
| -rw-r--r-- | src/wait/thread.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/wait/thread.rs b/src/wait/thread.rs new file mode 100644 index 0000000..0eadc3c --- /dev/null +++ b/src/wait/thread.rs @@ -0,0 +1,51 @@ +use std::{ + sync::mpsc::{Receiver, channel}, + thread::JoinHandle, time::Duration, +}; + +use crate::defer; + +pub struct ThreadWaiter<T> { + handle: JoinHandle<T>, + chan: Receiver<()>, + done: bool, +} + +pub fn spawn<T, F>(fun: F) -> ThreadWaiter<T> +where + T: Send + 'static, + F: Send + 'static, + F: FnOnce() -> T, +{ + let (tx, rx) = channel(); + + let handle = std::thread::spawn(move || { + defer! { + let _ = tx.send(()); + }; + fun() + }); + + ThreadWaiter { + handle, + chan: rx, + done: false, + } +} + +impl<T> ThreadWaiter<T> { + pub fn try_join(&mut self, timeout_ms: u16) -> bool { + if self.done { + return true; + } + + if let Ok(()) = self.chan.recv_timeout(Duration::from_millis(timeout_ms as _)) { + self.done = true; + } + + self.done + } + pub fn into_inner(self) -> JoinHandle<T> { + self.handle + } +} |
