uexec/
main_task.rs

1use std::sync::{
2    atomic::{AtomicBool, Ordering},
3    Arc,
4};
5
6use crossbeam_utils::sync::Unparker;
7
8/* Context to properly exit block_on once the main task has exited */
9pub(crate) struct MainTaskContext {
10    exited: Arc<AtomicBool>,
11    unparker: Unparker,
12}
13
14impl MainTaskContext {
15    pub(crate) fn new(unparker: Unparker) -> Self {
16        Self {
17            exited: Arc::new(AtomicBool::new(false)),
18            unparker,
19        }
20    }
21
22    pub(crate) fn exited(&self) -> Arc<AtomicBool> {
23        self.exited.clone()
24    }
25
26    pub(crate) fn exit(&self) {
27        self.exited.store(true, Ordering::Release);
28        self.unparker.unpark();
29    }
30}