Trait koto_runtime::KotoSync

1.0.0 · source ·
pub unsafe auto trait KotoSync { }
Expand description

Types for which it is safe to share references between threads.

This trait is automatically implemented when the compiler determines it’s appropriate.

The precise definition is: a type T is Sync if and only if &T is Send. In other words, if there is no possibility of undefined behavior (including data races) when passing &T references between threads.

As one would expect, primitive types like u8 and f64 are all Sync, and so are simple aggregate types containing them, like tuples, structs and enums. More examples of basic Sync types include “immutable” types like &T, and those with simple inherited mutability, such as Box<T>, Vec<T> and most other collection types. (Generic parameters need to be Sync for their container to be Sync.)

A somewhat surprising consequence of the definition is that &mut T is Sync (if T is Sync) even though it seems like that might provide unsynchronized mutation. The trick is that a mutable reference behind a shared reference (that is, & &mut T) becomes read-only, as if it were a & &T. Hence there is no risk of a data race.

A shorter overview of how Sync and Send relate to referencing:

  • &T is Send if and only if T is Sync
  • &mut T is Send if and only if T is Send
  • &T and &mut T are Sync if and only if T is Sync

Types that are not Sync are those that have “interior mutability” in a non-thread-safe form, such as Cell and RefCell. These types allow for mutation of their contents even through an immutable, shared reference. For example the set method on Cell<T> takes &self, so it requires only a shared reference &Cell<T>. The method performs no synchronization, thus Cell cannot be Sync.

Another example of a non-Sync type is the reference-counting pointer Rc. Given any reference &Rc<T>, you can clone a new Rc<T>, modifying the reference counts in a non-atomic way.

For cases when one does need thread-safe interior mutability, Rust provides atomic data types, as well as explicit locking via sync::Mutex and sync::RwLock. These types ensure that any mutation cannot cause data races, hence the types are Sync. Likewise, sync::Arc provides a thread-safe analogue of Rc.

Any types with interior mutability must also use the cell::UnsafeCell wrapper around the value(s) which can be mutated through a shared reference. Failing to doing this is undefined behavior. For example, transmute-ing from &T to &mut T is invalid.

See the Nomicon for more details about Sync.

Implementors§

source§

impl !Sync for LocalWaker

1.26.0 · source§

impl !Sync for Args

1.26.0 · source§

impl !Sync for ArgsOs

1.6.0 · source§

impl Sync for alloc::string::Drain<'_>

source§

impl Sync for AtomicBool

1.34.0 · source§

impl Sync for AtomicI8

1.34.0 · source§

impl Sync for AtomicI16

1.34.0 · source§

impl Sync for AtomicI32

1.34.0 · source§

impl Sync for AtomicI64

source§

impl Sync for AtomicI128

source§

impl Sync for AtomicIsize

1.34.0 · source§

impl Sync for AtomicU8

1.34.0 · source§

impl Sync for AtomicU16

1.34.0 · source§

impl Sync for AtomicU32

1.34.0 · source§

impl Sync for AtomicU64

source§

impl Sync for AtomicU128

source§

impl Sync for AtomicUsize

1.36.0 · source§

impl Sync for Waker

1.63.0 · source§

impl Sync for BorrowedHandle<'_>

1.63.0 · source§

impl Sync for HandleOrInvalid

1.63.0 · source§

impl Sync for HandleOrNull

1.63.0 · source§

impl Sync for OwnedHandle

source§

impl Sync for GuardNoSend

1.44.0 · source§

impl<'a> Sync for IoSlice<'a>

1.44.0 · source§

impl<'a> Sync for IoSliceMut<'a>

source§

impl<'a, 'b, K, Q, V, S, A> Sync for OccupiedEntryRef<'a, 'b, K, Q, V, S, A>
where K: Sync, Q: Sync + ?Sized, V: Sync, S: Sync, A: Sync + Allocator,

source§

impl<'a, R, G, T> Sync for MappedReentrantMutexGuard<'a, R, G, T>
where R: RawMutex + Sync + 'a, G: GetThreadId + Sync + 'a, T: Sync + 'a + ?Sized,

source§

impl<'a, R, G, T> Sync for ReentrantMutexGuard<'a, R, G, T>
where R: RawMutex + Sync + 'a, G: GetThreadId + Sync + 'a, T: Sync + 'a + ?Sized,

source§

impl<'a, R, T> Sync for lock_api::mutex::MappedMutexGuard<'a, R, T>
where R: RawMutex + Sync + 'a, T: Sync + 'a + ?Sized,

source§

impl<'a, R, T> Sync for lock_api::mutex::MutexGuard<'a, R, T>
where R: RawMutex + Sync + 'a, T: Sync + 'a + ?Sized,

source§

impl<'a, R, T> Sync for lock_api::rwlock::MappedRwLockReadGuard<'a, R, T>
where R: RawRwLock + 'a, T: Sync + 'a + ?Sized,

source§

impl<'a, R, T> Sync for lock_api::rwlock::MappedRwLockWriteGuard<'a, R, T>
where R: RawRwLock + 'a, T: Sync + 'a + ?Sized,

source§

impl<'a, R, T> Sync for RwLockUpgradableReadGuard<'a, R, T>
where R: RawRwLockUpgrade + 'a, T: Sync + 'a + ?Sized,

source§

impl<'a, T> Sync for smallvec::Drain<'a, T>
where T: Sync + Array,

source§

impl<Dyn> Sync for DynMetadata<Dyn>
where Dyn: ?Sized,

source§

impl<K, V, S, A> Sync for hashbrown::map::OccupiedEntry<'_, K, V, S, A>
where K: Sync, V: Sync, S: Sync, A: Sync + Allocator,

source§

impl<K, V, S, A> Sync for RawOccupiedEntryMut<'_, K, V, S, A>
where K: Sync, V: Sync, S: Sync, A: Sync + Allocator,

source§

impl<R, G> Sync for RawReentrantMutex<R, G>
where R: RawMutex + Sync, G: GetThreadId + Sync,

source§

impl<R, G, T> Sync for ReentrantMutex<R, G, T>
where R: RawMutex + Sync, G: GetThreadId + Sync, T: Send + ?Sized,

source§

impl<R, T> Sync for lock_api::mutex::Mutex<R, T>
where R: RawMutex + Sync, T: Send + ?Sized,

source§

impl<R, T> Sync for lock_api::rwlock::RwLock<R, T>
where R: RawRwLock + Sync, T: Send + Sync + ?Sized,

source§

impl<R, T> Sync for lock_api::rwlock::RwLockReadGuard<'_, R, T>
where R: RawRwLock + Sync, T: Sync + ?Sized,

source§

impl<R, T> Sync for lock_api::rwlock::RwLockWriteGuard<'_, R, T>
where R: RawRwLock + Sync, T: Sync + ?Sized,

source§

impl<T> !Sync for *const T
where T: ?Sized,

source§

impl<T> !Sync for *mut T
where T: ?Sized,

1.70.0 · source§

impl<T> !Sync for OnceCell<T>

source§

impl<T> !Sync for Cell<T>
where T: ?Sized,

source§

impl<T> !Sync for RefCell<T>
where T: ?Sized,

source§

impl<T> !Sync for UnsafeCell<T>
where T: ?Sized,

1.25.0 · source§

impl<T> !Sync for NonNull<T>
where T: ?Sized,

NonNull pointers are not Sync because the data they reference may be aliased.

source§

impl<T> !Sync for Receiver<T>

source§

impl<T> Sync for ThinBox<T>
where T: Sync + ?Sized,

ThinBox<T> is Sync if T is Sync because the data is owned.

source§

impl<T> Sync for alloc::collections::linked_list::Iter<'_, T>
where T: Sync,

source§

impl<T> Sync for alloc::collections::linked_list::IterMut<'_, T>
where T: Sync,

source§

impl<T> Sync for SyncUnsafeCell<T>
where T: Sync + ?Sized,

1.28.0 · source§

impl<T> Sync for NonZero<T>

1.31.0 · source§

impl<T> Sync for ChunksExactMut<'_, T>
where T: Sync,

source§

impl<T> Sync for ChunksMut<'_, T>
where T: Sync,

source§

impl<T> Sync for core::slice::iter::Iter<'_, T>
where T: Sync,

source§

impl<T> Sync for core::slice::iter::IterMut<'_, T>
where T: Sync,

1.31.0 · source§

impl<T> Sync for RChunksExactMut<'_, T>
where T: Sync,

1.31.0 · source§

impl<T> Sync for RChunksMut<'_, T>
where T: Sync,

source§

impl<T> Sync for AtomicPtr<T>

source§

impl<T> Sync for Exclusive<T>
where T: ?Sized,

1.72.0 · source§

impl<T> Sync for Sender<T>
where T: Send,

source§

impl<T> Sync for std::sync::mutex::MappedMutexGuard<'_, T>
where T: Sync + ?Sized,

source§

impl<T> Sync for std::sync::mutex::Mutex<T>
where T: Send + ?Sized,

1.19.0 · source§

impl<T> Sync for std::sync::mutex::MutexGuard<'_, T>
where T: Sync + ?Sized,

1.70.0 · source§

impl<T> Sync for OnceLock<T>
where T: Sync + Send,

source§

impl<T> Sync for ReentrantLock<T>
where T: Send + ?Sized,

source§

impl<T> Sync for std::sync::rwlock::MappedRwLockReadGuard<'_, T>
where T: Sync + ?Sized,

source§

impl<T> Sync for std::sync::rwlock::MappedRwLockWriteGuard<'_, T>
where T: Sync + ?Sized,

source§

impl<T> Sync for std::sync::rwlock::RwLock<T>
where T: Send + Sync + ?Sized,

1.23.0 · source§

impl<T> Sync for std::sync::rwlock::RwLockReadGuard<'_, T>
where T: Sync + ?Sized,

1.23.0 · source§

impl<T> Sync for std::sync::rwlock::RwLockWriteGuard<'_, T>
where T: Sync + ?Sized,

1.29.0 · source§

impl<T> Sync for JoinHandle<T>

source§

impl<T, A> !Sync for Rc<T, A>
where A: Allocator, T: ?Sized,

1.4.0 · source§

impl<T, A> !Sync for alloc::rc::Weak<T, A>
where A: Allocator, T: ?Sized,

source§

impl<T, A> Sync for Cursor<'_, T, A>
where T: Sync, A: Allocator + Sync,

source§

impl<T, A> Sync for CursorMut<'_, T, A>
where T: Sync, A: Allocator + Sync,

source§

impl<T, A> Sync for LinkedList<T, A>
where T: Sync, A: Allocator + Sync,

1.6.0 · source§

impl<T, A> Sync for alloc::collections::vec_deque::drain::Drain<'_, T, A>
where T: Sync, A: Allocator + Sync,

source§

impl<T, A> Sync for Arc<T, A>
where T: Sync + Send + ?Sized, A: Allocator + Sync,

1.4.0 · source§

impl<T, A> Sync for alloc::sync::Weak<T, A>
where T: Sync + Send + ?Sized, A: Allocator + Sync,

1.6.0 · source§

impl<T, A> Sync for alloc::vec::drain::Drain<'_, T, A>
where T: Sync, A: Sync + Allocator,

source§

impl<T, A> Sync for IntoIter<T, A>
where T: Sync, A: Allocator + Sync,

source§

impl<T, A> Sync for RawDrain<'_, T, A>
where A: Allocator + Sync, T: Sync,

source§

impl<T, A> Sync for RawIntoIter<T, A>
where A: Allocator + Sync, T: Sync,

source§

impl<T, A> Sync for RawTable<T, A>
where A: Allocator + Sync, T: Sync,

source§

impl<T, A> Sync for hashbrown::table::OccupiedEntry<'_, T, A>
where T: Sync, A: Sync + Allocator,

source§

impl<T, F> Sync for LazyLock<T, F>
where T: Sync + Send, F: Send,

source§

impl<T, F, S> Sync for ScopeGuard<T, F, S>
where T: Sync, F: FnOnce(T), S: Strategy,

Auto implementors§

§

impl Sync for ChunksError

§

impl Sync for ReversedError

§

impl Sync for StepError

§

impl Sync for WindowsError

§

impl Sync for ErrorKind

§

impl Sync for ReturnOrYield

§

impl Sync for BinaryOp

§

impl Sync for IsIterable

§

impl Sync for KIteratorOutput

§

impl Sync for KNumber

§

impl Sync for KValue

§

impl Sync for MetaKey

§

impl Sync for UnaryOp

§

impl Sync for File

§

impl Sync for Chain

§

impl Sync for Chunks

§

impl Sync for Cycle

§

impl Sync for Each

§

impl Sync for Enumerate

§

impl Sync for Flatten

§

impl Sync for Intersperse

§

impl Sync for IntersperseWith

§

impl Sync for Keep

§

impl Sync for PairFirst

§

impl Sync for PairSecond

§

impl Sync for Reversed

§

impl Sync for Step

§

impl Sync for Take

§

impl Sync for TakeWhile

§

impl Sync for Windows

§

impl Sync for Zip

§

impl Sync for Generate

§

impl Sync for GenerateN

§

impl Sync for Once

§

impl Sync for Repeat

§

impl Sync for RepeatN

§

impl Sync for Peekable

§

impl Sync for IteratorOutput

§

impl Sync for Chunk

§

impl Sync for DateTime

§

impl Sync for Timer

§

impl Sync for Bytes

§

impl Sync for CharIndices

§

impl Sync for Lines

§

impl Sync for Split

§

impl Sync for SplitWith

§

impl Sync for CoreLib

§

impl Sync for KIterator

§

impl Sync for KList

§

impl Sync for KMap

§

impl Sync for KNativeFunction

§

impl Sync for KObject

§

impl Sync for KRange

§

impl Sync for KString

§

impl Sync for KTuple

§

impl Sync for KotoVm

§

impl Sync for KotoVmSettings

§

impl Sync for MetaMap

§

impl Sync for ValueKey

§

impl Sync for ValueMap

§

impl Sync for DefaultStderr

§

impl Sync for DefaultStdin

§

impl Sync for DefaultStdout

§

impl Sync for Error

§

impl Sync for KCaptureFunction

§

impl Sync for KFunction

§

impl<'a> !Sync for DisplayContext<'a>

§

impl<'a> Sync for CallArgs<'a>

§

impl<'a> Sync for CallContext<'a>

§

impl<'a, T> Sync for MethodContext<'a, T>
where T: Sync,

§

impl<'a, T> Sync for Borrow<'a, T>
where T: Sync + ?Sized,

§

impl<'a, T> Sync for BorrowMut<'a, T>
where T: Sync + ?Sized,

§

impl<T> Sync for BufferedFile<T>
where T: Sync,

§

impl<T> Sync for KCell<T>
where T: Send + Sync + ?Sized,

§

impl<T> Sync for Ptr<T>
where T: Sync + Send + ?Sized,