pub unsafe auto trait Send { }
Expand description
Types that can be transferred across thread boundaries.
This trait is automatically implemented when the compiler determines it’s
appropriate.
An example of a non-Send
type is the reference-counting pointer
rc::Rc
. If two threads attempt to clone Rc
s that point to the same
reference-counted value, they might try to update the reference count at the
same time, which is undefined behavior because Rc
doesn’t use atomic
operations. Its cousin sync::Arc
does use atomic operations (incurring
some overhead) and thus is Send
.
See the Nomicon for more details.
NonNull
pointers are not Send
because the data they reference may be aliased.
Conditionally mark BitSlice
as Send
based on its T
type argument.
In order for BitSlice
to be Send
(that is, &mut BitSlice
can be moved
across thread boundaries), it must be capable of writing to memory without
invalidating any other &BitSlice
handles that alias the same memory address.
This is true when T
is one of the fundamental integers, because no other
&BitSlice
handle is able to observe mutations, or when T
is a BitSafe
type
that implements atomic read-modify-write instructions, because other &BitSlice
types will be protected from data races by the hardware.
When T
is a non-atomic BitSafe
type, BitSlice
cannot be Send
, because
one &mut BitSlice
moved across a thread boundary may cause mutation that
another &BitSlice
may observe, but the instructions used to access memory do
not guard against data races.
A &mut BitSlice
over aliased memory addresses is equivalent to either a
&Cell
or &AtomicT
, depending on what the radium
crate makes available
for the register width.
impl<'_> Send for scale_info::prelude::string::Drain<'_>
impl<'_, T> Send for scale_info::prelude::collections::linked_list::Iter<'_, T> where
T: Sync,
impl<'_, T> Send for scale_info::prelude::collections::linked_list::IterMut<'_, T> where
T: Send,
impl<'_, T> Send for scale_info::prelude::collections::vec_deque::IterMut<'_, T> where
T: Send,
impl<K, V, S, A> Send for OccupiedEntry<'_, K, V, S, A> where
K: Send,
V: Send,
S: Send,
A: Send + Allocator + Clone,
impl<'a, T: Scalar + Send, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Send for SliceStorage<'a, T, R, C, RStride, CStride>
impl<'a, T: Scalar + Send, R: Dim, C: Dim, RStride: Dim, CStride: Dim> Send for SliceStorageMut<'a, T, R, C, RStride, CStride>
impl<'a, K> Send for scale_info::prelude::collections::hash_set::Drain<'a, K> where
K: Send,
impl<'a, K> Send for scale_info::prelude::collections::hash_set::Iter<'a, K> where
K: Sync,
impl<'a, K, V> Send for scale_info::prelude::collections::btree_map::Entry<'a, K, V> where
K: Send,
V: Send,
impl<'a, K, V> Send for scale_info::prelude::collections::hash_map::Entry<'a, K, V> where
K: Send,
V: Send,
impl<'a, K, V> Send for scale_info::prelude::collections::btree_map::Iter<'a, K, V> where
K: Sync,
V: Sync,
impl<'a, K, V> Send for scale_info::prelude::collections::btree_map::IterMut<'a, K, V> where
K: Send,
V: Send,
impl<'a, K, V> Send for scale_info::prelude::collections::btree_map::Keys<'a, K, V> where
K: Sync,
V: Sync,
impl<'a, K, V> Send for scale_info::prelude::collections::btree_map::Range<'a, K, V> where
K: Sync,
V: Sync,
impl<'a, K, V> Send for scale_info::prelude::collections::btree_map::Values<'a, K, V> where
K: Sync,
V: Sync,
impl<'a, K, V> Send for scale_info::prelude::collections::btree_map::ValuesMut<'a, K, V> where
K: Send,
V: Send,
impl<'a, K, V> Send for scale_info::prelude::collections::hash_map::Drain<'a, K, V> where
K: Send,
V: Send,
impl<'a, K, V> Send for scale_info::prelude::collections::hash_map::Iter<'a, K, V> where
K: Sync,
V: Sync,
impl<'a, K, V> Send for scale_info::prelude::collections::hash_map::IterMut<'a, K, V> where
K: Send,
V: Send,
impl<'a, K, V> Send for scale_info::prelude::collections::hash_map::Keys<'a, K, V> where
K: Sync,
V: Sync,
impl<'a, K, V> Send for scale_info::prelude::collections::hash_map::Values<'a, K, V> where
K: Sync,
V: Sync,
impl<'a, K, V> Send for scale_info::prelude::collections::hash_map::ValuesMut<'a, K, V> where
K: Send,
V: Send,
impl<'a, T> Send for scale_info::prelude::collections::binary_heap::Drain<'a, T> where
T: Send,
impl<'a, T> Send for scale_info::prelude::collections::binary_heap::Iter<'a, T> where
T: Sync,
impl<'a, T> Send for scale_info::prelude::collections::btree_set::Difference<'a, T> where
T: Sync,
impl<'a, T> Send for scale_info::prelude::collections::btree_set::Intersection<'a, T> where
T: Sync,
impl<'a, T> Send for scale_info::prelude::collections::btree_set::Iter<'a, T> where
T: Sync,
impl<'a, T> Send for scale_info::prelude::collections::btree_set::Range<'a, T> where
T: Sync,
impl<'a, T> Send for scale_info::prelude::collections::btree_set::Union<'a, T> where
T: Sync,
impl<'a, T> Send for scale_info::prelude::collections::vec_deque::Iter<'a, T> where
T: Sync,
impl<'a, T, F> !Send for scale_info::prelude::collections::linked_list::DrainFilter<'a, T, F>
impl<'a, T, S> Send for scale_info::prelude::collections::hash_set::Difference<'a, T, S> where
S: Sync,
T: Sync,
impl<'a, T, S> Send for scale_info::prelude::collections::hash_set::Union<'a, T, S> where
S: Sync,
T: Sync,
impl<Idx> Send for scale_info::prelude::ops::Range<Idx> where
Idx: Send,
impl<K> Send for scale_info::prelude::collections::hash_set::IntoIter<K> where
K: Send,
impl<K, V> Send for scale_info::prelude::collections::btree_map::IntoIter<K, V> where
K: Send,
V: Send,
impl<K, V> Send for scale_info::prelude::collections::btree_map::IntoKeys<K, V> where
K: Send,
V: Send,
impl<K, V> Send for scale_info::prelude::collections::hash_map::IntoIter<K, V> where
K: Send,
V: Send,
impl<K, V> Send for scale_info::prelude::collections::hash_map::IntoKeys<K, V> where
K: Send,
V: Send,
impl<T> Send for scale_info::prelude::collections::binary_heap::IntoIter<T> where
T: Send,
impl<T> Send for scale_info::prelude::collections::btree_set::IntoIter<T> where
T: Send,
impl<T> Send for scale_info::prelude::collections::linked_list::IntoIter<T> where
T: Send,
impl<T, A> Send for scale_info::prelude::collections::vec_deque::IntoIter<T, A> where
A: Send,
T: Send,
impl<St, Fut, T, F> Send for Fold<St, Fut, T, F> where
F: Send,
Fut: Send,
St: Send,
T: Send,
impl<St, S, Fut, F> Send for Scan<St, S, Fut, F> where
F: Send,
Fut: Send,
S: Send,
St: Send,
impl<St, Fut, T, F> Send for TryFold<St, Fut, T, F> where
F: Send,
Fut: Send,
St: Send,
T: Send,
impl<St1, St2, Clos, State> Send for SelectWithStrategy<St1, St2, Clos, State> where
Clos: Send,
St1: Send,
St2: Send,
State: Send,
impl<Si, Item, U, Fut, F> Send for With<Si, Item, U, Fut, F> where
F: Send,
Fut: Send,
Si: Send,
impl<Si, Item, U, St, F> Send for WithFlatMap<Si, Item, U, St, F> where
F: Send,
Item: Send,
Si: Send,
St: Send,
impl<'abbrev, 'entry, 'unit, R> !Send for AttrsIter<'abbrev, 'entry, 'unit, R>
impl<'a, K, V, F, A> Send for DrainFilter<'a, K, V, F, A> where
F: Send,
K: Send,
V: Send,
impl<'a, K, V, S, A> Send for RawEntryMut<'a, K, V, S, A> where
A: Send,
K: Send,
S: Sync,
V: Send,
impl<'a, K, V, S, A> Send for RawEntryBuilder<'a, K, V, S, A> where
K: Sync,
S: Sync,
V: Sync,
impl<'a, K, V, S, A> Send for Entry<'a, K, V, S, A> where
A: Send,
K: Send,
S: Send,
V: Send,
impl<'a, K, V, S, A> Send for VacantEntry<'a, K, V, S, A> where
K: Send,
S: Send,
V: Send,
impl<'a, K, V, S, A> Send for OccupiedError<'a, K, V, S, A> where
A: Send,
K: Send,
S: Send,
V: Send,
impl<'a, T, R, C, S> Send for RowIter<'a, T, R, C, S> where
S: Sync,
T: Sync,
impl<'a, T, R, C, S> Send for ColumnIter<'a, T, R, C, S> where
S: Sync,
T: Sync,
impl<T, R, C, S> Send for Matrix<T, R, C, S> where
C: Send,
R: Send,
S: Send,
T: Send,
impl<T, R, C> !Send for LU<T, R, C>
impl<T, R, C> !Send for QR<T, R, C>
impl<T, R, C> !Send for SVD<T, R, C>
impl<ReserveIdentifier, Balance> Send for ReserveData<ReserveIdentifier, Balance> where
Balance: Send,
ReserveIdentifier: Send,
impl<ReserveIdentifier, Balance> Send for ReserveData<ReserveIdentifier, Balance> where
Balance: Send,
ReserveIdentifier: Send,
impl<Header, Extrinsic> Send for Block<Header, Extrinsic> where
Extrinsic: Send,
Header: Send,
impl<AccountId, Hash, BlockNumber> Send for Record<AccountId, Hash, BlockNumber> where
AccountId: Send,
BlockNumber: Send,
Hash: Send,
impl<AccountId, ReferenceHash, NumberOfBlocks, LockStatus, StatusOfTimeRecord, ReasonCodeStruct, PostingPeriod, StartOrEndBlockNumber, NumberOfBreaks> Send for Timekeeper<AccountId, ReferenceHash, NumberOfBlocks, LockStatus, StatusOfTimeRecord, ReasonCodeStruct, PostingPeriod, StartOrEndBlockNumber, NumberOfBreaks> where
AccountId: Send,
LockStatus: Send,
NumberOfBlocks: Send,
NumberOfBreaks: Send,
PostingPeriod: Send,
ReasonCodeStruct: Send,
ReferenceHash: Send,
StartOrEndBlockNumber: Send,
StatusOfTimeRecord: Send,
impl<S, N, E, W> Send for Layer<S, N, E, W> where
E: Send,
N: Send,
S: Send,
W: Send,
impl<'a, H, HO, V, DB> Send for TrieBuilder<'a, H, HO, V, DB> where
DB: Send,
H: Send,
HO: Send,
V: Send,