1 //! Miscellaneous tools for concurrent programming. 2 //! 3 //! ## Atomics 4 //! 5 //! * [`AtomicCell`], a thread-safe mutable memory location. 6 //! * [`AtomicConsume`], for reading from primitive atomic types with "consume" ordering. 7 //! 8 //! ## Thread synchronization 9 //! 10 //! * [`Parker`], a thread parking primitive. 11 //! * [`ShardedLock`], a sharded reader-writer lock with fast concurrent reads. 12 //! * [`WaitGroup`], for synchronizing the beginning or end of some computation. 13 //! 14 //! ## Utilities 15 //! 16 //! * [`Backoff`], for exponential backoff in spin loops. 17 //! * [`CachePadded`], for padding and aligning a value to the length of a cache line. 18 //! * [`scope`], for spawning threads that borrow local variables from the stack. 19 //! 20 //! [`AtomicCell`]: atomic::AtomicCell 21 //! [`AtomicConsume`]: atomic::AtomicConsume 22 //! [`Parker`]: sync::Parker 23 //! [`ShardedLock`]: sync::ShardedLock 24 //! [`WaitGroup`]: sync::WaitGroup 25 //! [`scope`]: thread::scope 26 27 #![no_std] 28 #![doc(test( 29 no_crate_inject, 30 attr( 31 deny(warnings, rust_2018_idioms), 32 allow(dead_code, unused_assignments, unused_variables) 33 ) 34 ))] 35 #![warn( 36 missing_docs, 37 missing_debug_implementations, 38 rust_2018_idioms, 39 unreachable_pub 40 )] 41 42 #[cfg(feature = "std")] 43 extern crate std; 44 45 #[cfg(crossbeam_loom)] 46 #[allow(unused_imports)] 47 mod primitive { 48 pub(crate) mod hint { 49 pub(crate) use loom::hint::spin_loop; 50 } 51 pub(crate) mod sync { 52 pub(crate) mod atomic { 53 pub(crate) use loom::sync::atomic::{ 54 AtomicBool, AtomicI16, AtomicI32, AtomicI64, AtomicI8, AtomicIsize, AtomicU16, 55 AtomicU32, AtomicU64, AtomicU8, AtomicUsize, Ordering, 56 }; 57 58 // FIXME: loom does not support compiler_fence at the moment. 59 // https://github.com/tokio-rs/loom/issues/117 60 // we use fence as a stand-in for compiler_fence for the time being. 61 // this may miss some races since fence is stronger than compiler_fence, 62 // but it's the best we can do for the time being. 63 pub(crate) use loom::sync::atomic::fence as compiler_fence; 64 } 65 pub(crate) use loom::sync::{Arc, Condvar, Mutex}; 66 } 67 } 68 #[cfg(not(crossbeam_loom))] 69 #[allow(unused_imports)] 70 mod primitive { 71 pub(crate) mod hint { 72 pub(crate) use core::hint::spin_loop; 73 } 74 pub(crate) mod sync { 75 pub(crate) mod atomic { 76 pub(crate) use core::sync::atomic::{compiler_fence, Ordering}; 77 #[cfg(not(crossbeam_no_atomic))] 78 pub(crate) use core::sync::atomic::{ 79 AtomicBool, AtomicI16, AtomicI8, AtomicIsize, AtomicU16, AtomicU8, AtomicUsize, 80 }; 81 #[cfg(not(crossbeam_no_atomic))] 82 #[cfg(any(target_has_atomic = "32", not(target_pointer_width = "16")))] 83 pub(crate) use core::sync::atomic::{AtomicI32, AtomicU32}; 84 #[cfg(not(crossbeam_no_atomic))] 85 #[cfg(any( 86 target_has_atomic = "64", 87 not(any(target_pointer_width = "16", target_pointer_width = "32")), 88 ))] 89 pub(crate) use core::sync::atomic::{AtomicI64, AtomicU64}; 90 } 91 92 #[cfg(feature = "std")] 93 pub(crate) use std::sync::{Arc, Condvar, Mutex}; 94 } 95 } 96 97 pub mod atomic; 98 99 mod cache_padded; 100 pub use crate::cache_padded::CachePadded; 101 102 mod backoff; 103 pub use crate::backoff::Backoff; 104 105 #[cfg(feature = "std")] 106 pub mod sync; 107 108 #[cfg(feature = "std")] 109 #[cfg(not(crossbeam_loom))] 110 pub mod thread; 111