Skip to main content

AtomicDataWithOwner

Struct AtomicDataWithOwner 

Source
#[repr(transparent)]
pub struct AtomicDataWithOwner<V, Own> { pub data: V, pub permission: Tracked<Own>, }
Expand description

A structure that combines some data with a permission to access it.

For example, in aster_common we can see a lot of structs with its owner associated. E.g., MetaSlotOwner is the owner of MetaSlot. This struct can be used to represent such a combination because now the permission is no longer exclusively owner by some specific CPU and is “shared” among multiple threads via atomic operations.

This struct is especially useful when used in conjunction with synchronization primitives like [Once], where we want to ensure that the data is initialized only once and the permission is preserved throughout the lifetime of the data.

§Examples

 struct MyData {
    pub foo: u32,
    pub bar: u32,
 }

tracked struct MyDataWithOwner {
   pub baz: nat,
   pub quz: Seq<int>,
}

impl Inv for MyData {
    // inv...
}

impl Predicate<MyData> for MyDataWithOwner {
   #[verifier::inline]
   open spec fn inv_with(self, v: MyData) -> bool {
        &&& self.baz == v.foo as nat
        &&& self.quz.len() == v.bar as nat
   }
}

type Data = AtomicDataWithOwner<MyData, MyDataWithOwner>;

Fields§

§data: V

The underlying data.

§permission: Tracked<Own>

The permission to access the data.

Implementations§

Source§

impl<V, Own> AtomicDataWithOwner<V, Own>

Source

pub exec fn new(data: V, permission: Tracked<Own>) -> Self

Trait Implementations§

Source§

impl<V, Own> Deref for AtomicDataWithOwner<V, Own>

Source§

exec fn deref(&self) -> &Self::Target

returns
self.data,
Source§

type Target = V

The resulting type after dereferencing.
Source§

impl<V, Own: Predicate<V>> Inv for AtomicDataWithOwner<V, Own>

Source§

open spec fn inv(self) -> bool

{
    &&& self.permission.predicate(self.data)

}
Source§

impl<T, Own> View for AtomicDataWithOwner<T, Own>

Source§

open spec fn view(&self) -> Self::V

{ self.data }
Source§

type V = T

Source§

impl<V, Own> !Clone for AtomicDataWithOwner<V, Own>

Source§

impl<V, Own> !Copy for AtomicDataWithOwner<V, Own>

Auto Trait Implementations§

§

impl<V, Own> Freeze for AtomicDataWithOwner<V, Own>
where V: Freeze,

§

impl<V, Own> RefUnwindSafe for AtomicDataWithOwner<V, Own>

§

impl<V, Own> Send for AtomicDataWithOwner<V, Own>
where V: Send, Own: Send,

§

impl<V, Own> Sync for AtomicDataWithOwner<V, Own>
where V: Sync, Own: Sync,

§

impl<V, Own> Unpin for AtomicDataWithOwner<V, Own>
where V: Unpin, Own: Unpin,

§

impl<V, Own> UnsafeUnpin for AtomicDataWithOwner<V, Own>
where V: UnsafeUnpin,

§

impl<V, Own> UnwindSafe for AtomicDataWithOwner<V, Own>
where V: UnwindSafe, Own: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> DerefSpec for T
where T: Deref,

§

fn deref_spec(&self) -> &<T as Deref>::Target

§

fn deref_spec_eq(&self)

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, VERUS_SPEC__A> FromSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: From<T>,

§

fn obeys_from_spec() -> bool

§

fn from_spec(v: T) -> VERUS_SPEC__A

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T, VERUS_SPEC__A> IntoSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: Into<T>,

§

fn obeys_into_spec() -> bool

§

fn into_spec(self) -> T

§

impl<T, U> IntoSpecImpl<U> for T
where U: From<T>,

§

fn obeys_into_spec() -> bool

§

fn into_spec(self) -> U

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, VERUS_SPEC__A> TryFromSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: TryFrom<T>,

§

fn obeys_try_from_spec() -> bool

§

fn try_from_spec( v: T, ) -> Result<VERUS_SPEC__A, <VERUS_SPEC__A as TryFrom<T>>::Error>

Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T, VERUS_SPEC__A> TryIntoSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: TryInto<T>,

§

fn obeys_try_into_spec() -> bool

§

fn try_into_spec(self) -> Result<T, <VERUS_SPEC__A as TryInto<T>>::Error>

§

impl<T, U> TryIntoSpecImpl<U> for T
where U: TryFrom<T>,

§

fn obeys_try_into_spec() -> bool

§

fn try_into_spec(self) -> Result<U, <U as TryFrom<T>>::Error>