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