1 #![cfg_attr(any(not(feature = "full"), loom), allow(unused_imports, dead_code))]
2 
3 mod atomic_u16;
4 mod atomic_u32;
5 mod atomic_u64;
6 mod atomic_usize;
7 mod barrier;
8 mod mutex;
9 #[cfg(all(feature = "parking_lot", not(miri)))]
10 mod parking_lot;
11 mod rwlock;
12 mod unsafe_cell;
13 
14 pub(crate) mod cell {
15     pub(crate) use super::unsafe_cell::UnsafeCell;
16 }
17 
18 #[cfg(any(
19     feature = "net",
20     feature = "process",
21     feature = "signal",
22     feature = "sync",
23 ))]
24 pub(crate) mod future {
25     pub(crate) use crate::sync::AtomicWaker;
26 }
27 
28 pub(crate) mod hint {
29     pub(crate) use std::hint::spin_loop;
30 }
31 
32 pub(crate) mod rand {
33     use std::collections::hash_map::RandomState;
34     use std::hash::{BuildHasher, Hash, Hasher};
35     use std::sync::atomic::AtomicU32;
36     use std::sync::atomic::Ordering::Relaxed;
37 
38     static COUNTER: AtomicU32 = AtomicU32::new(1);
39 
seed() -> u6440     pub(crate) fn seed() -> u64 {
41         let rand_state = RandomState::new();
42 
43         let mut hasher = rand_state.build_hasher();
44 
45         // Hash some unique-ish data to generate some new state
46         COUNTER.fetch_add(1, Relaxed).hash(&mut hasher);
47 
48         // Get the seed
49         hasher.finish()
50     }
51 }
52 
53 pub(crate) mod sync {
54     pub(crate) use std::sync::{Arc, Weak};
55 
56     // Below, make sure all the feature-influenced types are exported for
57     // internal use. Note however that some are not _currently_ named by
58     // consuming code.
59 
60     #[cfg(all(feature = "parking_lot", not(miri)))]
61     #[allow(unused_imports)]
62     pub(crate) use crate::loom::std::parking_lot::{
63         Condvar, Mutex, MutexGuard, RwLock, RwLockReadGuard, WaitTimeoutResult,
64     };
65 
66     #[cfg(not(all(feature = "parking_lot", not(miri))))]
67     #[allow(unused_imports)]
68     pub(crate) use std::sync::{Condvar, MutexGuard, RwLockReadGuard, WaitTimeoutResult};
69 
70     #[cfg(not(all(feature = "parking_lot", not(miri))))]
71     pub(crate) use crate::loom::std::mutex::Mutex;
72 
73     #[cfg(not(all(feature = "parking_lot", not(miri))))]
74     pub(crate) use crate::loom::std::rwlock::RwLock;
75 
76     pub(crate) mod atomic {
77         pub(crate) use crate::loom::std::atomic_u16::AtomicU16;
78         pub(crate) use crate::loom::std::atomic_u32::AtomicU32;
79         pub(crate) use crate::loom::std::atomic_u64::{AtomicU64, StaticAtomicU64};
80         pub(crate) use crate::loom::std::atomic_usize::AtomicUsize;
81 
82         pub(crate) use std::sync::atomic::{fence, AtomicBool, AtomicPtr, AtomicU8, Ordering};
83     }
84 
85     pub(crate) use super::barrier::Barrier;
86 }
87 
88 pub(crate) mod sys {
89     #[cfg(feature = "rt-multi-thread")]
num_cpus() -> usize90     pub(crate) fn num_cpus() -> usize {
91         use std::num::NonZeroUsize;
92 
93         const ENV_WORKER_THREADS: &str = "TOKIO_WORKER_THREADS";
94 
95         match std::env::var(ENV_WORKER_THREADS) {
96             Ok(s) => {
97                 let n = s.parse().unwrap_or_else(|e| {
98                     panic!("\"{ENV_WORKER_THREADS}\" must be usize, error: {e}, value: {s}")
99                 });
100                 assert!(n > 0, "\"{ENV_WORKER_THREADS}\" cannot be set to 0");
101                 n
102             }
103             Err(std::env::VarError::NotPresent) => {
104                 std::thread::available_parallelism().map_or(1, NonZeroUsize::get)
105             }
106             Err(std::env::VarError::NotUnicode(e)) => {
107                 panic!("\"{ENV_WORKER_THREADS}\" must be valid unicode, error: {e:?}")
108             }
109         }
110     }
111 
112     #[cfg(not(feature = "rt-multi-thread"))]
num_cpus() -> usize113     pub(crate) fn num_cpus() -> usize {
114         1
115     }
116 }
117 
118 pub(crate) mod thread {
119     #[inline]
yield_now()120     pub(crate) fn yield_now() {
121         std::hint::spin_loop();
122     }
123 
124     #[allow(unused_imports)]
125     pub(crate) use std::thread::{
126         current, panicking, park, park_timeout, sleep, spawn, AccessError, Builder, JoinHandle,
127         LocalKey, Result, Thread, ThreadId,
128     };
129 }
130