wasmer_wasix/utils/
thread_parker.rs1use std::{
2 sync::{Arc, Condvar, Mutex},
3 task::Waker,
4 time::Duration,
5};
6
7#[derive(Debug)]
10pub struct WasiParkingLot {
11 waker: Waker,
12 #[allow(dead_code)]
13 run: Arc<(Mutex<bool>, Condvar)>,
14}
15
16impl Default for WasiParkingLot {
17 fn default() -> Self {
18 Self::new(true)
19 }
20}
21
22impl WasiParkingLot {
23 pub fn new(initial_val: bool) -> Self {
25 let run = Arc::new((Mutex::new(initial_val), Condvar::default()));
26 let waker = {
27 let run = run.clone();
28 waker_fn::waker_fn(move || {
29 let mut guard = run.0.lock().unwrap();
30 *guard = true;
31 run.1.notify_one();
32 })
33 };
34
35 Self { waker, run }
36 }
37
38 pub fn get_waker(&self) -> Waker {
41 self.waker.clone()
42 }
43
44 pub fn wake(&self) {
46 self.waker.wake_by_ref();
47 }
48
49 #[allow(dead_code)]
53 pub fn wait(&self, timeout: Duration) -> bool {
54 let mut run = self.run.0.lock().unwrap();
55 if *run {
56 *run = false;
57 return true;
58 }
59 loop {
60 let woken = self.run.1.wait_timeout(run, timeout).unwrap();
61 if woken.1.timed_out() {
62 return false;
63 }
64 run = woken.0;
65 if *run {
66 *run = false;
67 return true;
68 }
69 }
70 }
71}