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