1 #![cfg_attr(any(not(feature = "full"), loom), allow(unused_imports, dead_code))] 2 3 mod atomic_ptr; 4 mod atomic_u16; 5 mod atomic_u32; 6 mod atomic_u64; 7 mod atomic_u8; 8 mod atomic_usize; 9 mod mutex; 10 #[cfg(feature = "parking_lot")] 11 mod parking_lot; 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 rand { 29 use std::collections::hash_map::RandomState; 30 use std::hash::{BuildHasher, Hash, Hasher}; 31 use std::sync::atomic::AtomicU32; 32 use std::sync::atomic::Ordering::Relaxed; 33 34 static COUNTER: AtomicU32 = AtomicU32::new(1); 35 seed() -> u6436 pub(crate) fn seed() -> u64 { 37 let rand_state = RandomState::new(); 38 39 let mut hasher = rand_state.build_hasher(); 40 41 // Hash some unique-ish data to generate some new state 42 COUNTER.fetch_add(1, Relaxed).hash(&mut hasher); 43 44 // Get the seed 45 hasher.finish() 46 } 47 } 48 49 pub(crate) mod sync { 50 pub(crate) use std::sync::{Arc, Weak}; 51 52 // Below, make sure all the feature-influenced types are exported for 53 // internal use. Note however that some are not _currently_ named by 54 // consuming code. 55 56 #[cfg(feature = "parking_lot")] 57 #[allow(unused_imports)] 58 pub(crate) use crate::loom::std::parking_lot::{ 59 Condvar, Mutex, MutexGuard, RwLock, RwLockReadGuard, WaitTimeoutResult, 60 }; 61 62 #[cfg(not(feature = "parking_lot"))] 63 #[allow(unused_imports)] 64 pub(crate) use std::sync::{Condvar, MutexGuard, RwLock, RwLockReadGuard, WaitTimeoutResult}; 65 66 #[cfg(not(feature = "parking_lot"))] 67 pub(crate) use crate::loom::std::mutex::Mutex; 68 69 pub(crate) mod atomic { 70 pub(crate) use crate::loom::std::atomic_ptr::AtomicPtr; 71 pub(crate) use crate::loom::std::atomic_u16::AtomicU16; 72 pub(crate) use crate::loom::std::atomic_u32::AtomicU32; 73 pub(crate) use crate::loom::std::atomic_u64::AtomicU64; 74 pub(crate) use crate::loom::std::atomic_u8::AtomicU8; 75 pub(crate) use crate::loom::std::atomic_usize::AtomicUsize; 76 77 pub(crate) use std::sync::atomic::{fence, AtomicBool, Ordering}; 78 // TODO: once we bump MSRV to 1.49+, use `hint::spin_loop` instead. 79 #[allow(deprecated)] 80 pub(crate) use std::sync::atomic::spin_loop_hint; 81 } 82 } 83 84 pub(crate) mod sys { 85 #[cfg(feature = "rt-multi-thread")] num_cpus() -> usize86 pub(crate) fn num_cpus() -> usize { 87 usize::max(1, num_cpus::get()) 88 } 89 90 #[cfg(not(feature = "rt-multi-thread"))] num_cpus() -> usize91 pub(crate) fn num_cpus() -> usize { 92 1 93 } 94 } 95 96 pub(crate) mod thread { 97 #[inline] yield_now()98 pub(crate) fn yield_now() { 99 // TODO: once we bump MSRV to 1.49+, use `hint::spin_loop` instead. 100 #[allow(deprecated)] 101 std::sync::atomic::spin_loop_hint(); 102 } 103 104 #[allow(unused_imports)] 105 pub(crate) use std::thread::{ 106 current, panicking, park, park_timeout, sleep, spawn, Builder, JoinHandle, LocalKey, 107 Result, Thread, ThreadId, 108 }; 109 } 110