wasmtime/runtime/vm/
always_mut.rs

1use core::fmt;
2
3/// A helper types that is `Send` if `T` is `Sync`.
4///
5/// This structure is a newtype wrapper around the `T` type parameter. What
6/// makes this a utility is the fact that it contains an `unsafe impl Sync`
7/// implementation for the type when `T` is `Send`. This is then coupled with
8/// the fact that there is no ability to access a shared reference, `&T`, from
9/// this type. Instead all access is done through `&mut T`.
10///
11/// This means that accessing the `T` in this data structure always requires
12/// exclusive `&mut self` access. This provides the trivial guarantee that this
13/// type is safe to share across threads because if you do so then you're just
14/// not able to do anything with it.
15#[derive(Default /* Do not derive traits with &self here, that's not sound */)]
16#[repr(transparent)]
17pub struct AlwaysMut<T>(T);
18
19// SAFETY: this is the purpose for existence of this type, meaning that if `T`
20// is `Send` then this type is `Sync` because it statically disallows shared
21// access to `T`.
22unsafe impl<T: Send> Sync for AlwaysMut<T> {}
23
24impl<T> AlwaysMut<T> {
25    /// Creates a new [`AlwaysMut`] with the provided value.
26    pub fn new(value: T) -> AlwaysMut<T> {
27        AlwaysMut(value)
28    }
29
30    /// Return a mutable reference to the underlying data in this [`AlwaysMut`]
31    pub fn get_mut(&mut self) -> &mut T {
32        &mut self.0
33    }
34
35    /// Consume this [`AlwaysMut`], returning the underlying data.
36    #[cfg(feature = "async")]
37    pub fn into_inner(self) -> T {
38        self.0
39    }
40}
41
42impl<T> From<T> for AlwaysMut<T> {
43    fn from(val: T) -> AlwaysMut<T> {
44        AlwaysMut::new(val)
45    }
46}
47
48impl<T> fmt::Debug for AlwaysMut<T> {
49    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50        f.debug_struct("AlwaysMut").finish_non_exhaustive()
51    }
52}