tokio/runtime/scheduler/
inject.rs
1use crate::loom::sync::Mutex;
4use crate::runtime::task;
5
6mod pop;
7pub(crate) use pop::Pop;
8
9mod shared;
10pub(crate) use shared::Shared;
11
12mod synced;
13pub(crate) use synced::Synced;
14
15cfg_rt_multi_thread! {
16 mod rt_multi_thread;
17}
18
19mod metrics;
20
21pub(crate) struct Inject<T: 'static> {
24 shared: Shared<T>,
25 synced: Mutex<Synced>,
26}
27
28impl<T: 'static> Inject<T> {
29 pub(crate) fn new() -> Inject<T> {
30 let (shared, synced) = Shared::new();
31
32 Inject {
33 shared,
34 synced: Mutex::new(synced),
35 }
36 }
37
38 #[cfg(tokio_taskdump)]
40 pub(crate) fn is_closed(&self) -> bool {
41 let synced = self.synced.lock();
42 self.shared.is_closed(&synced)
43 }
44
45 pub(crate) fn close(&self) -> bool {
48 let mut synced = self.synced.lock();
49 self.shared.close(&mut synced)
50 }
51
52 pub(crate) fn push(&self, task: task::Notified<T>) {
56 let mut synced = self.synced.lock();
57 unsafe { self.shared.push(&mut synced, task) }
59 }
60
61 pub(crate) fn pop(&self) -> Option<task::Notified<T>> {
62 if self.shared.is_empty() {
63 return None;
64 }
65
66 let mut synced = self.synced.lock();
67 unsafe { self.shared.pop(&mut synced) }
69 }
70}