Struct rkyv::with::Lock

source ·
pub struct Lock;
Expand description

A wrapper that locks a lock and serializes the value immutably.

This wrapper can panic under very specific circumstances when:

  1. serialize_with is called and succeeds in locking the value to serialize it.
  2. Another thread locks the value and panics, poisoning the lock
  3. resolve_with is called and gets a poisoned value.

Unfortunately, it’s not possible to work around this issue. If your code absolutely must not panic under any circumstances, it’s recommended that you lock your values and then serialize them while locked.

Additionally, mutating the data protected by a mutex between the serialize and resolve steps may cause undefined behavior in the resolve step. Uses of this wrapper should be considered unsafe with the requirement that the data not be mutated between these two steps.

Regular serializers don’t support the custom error handling needed for this type by default. To use this wrapper, a custom serializer with an error type satisfying <S as Fallible>::Error: From<LockError> must be provided.

Example

use std::sync::Mutex;
use rkyv::{Archive, with::Lock};

#[derive(Archive)]
struct Example {
    #[with(Lock)]
    a: Mutex<i32>,
}

Trait Implementations§

source§

impl<F: Archive> ArchiveWith<Mutex<F>> for Lock

§

type Archived = Immutable<<F as Archive>::Archived>

The archived type of a With<F, Self>.
§

type Resolver = <F as Archive>::Resolver

The resolver of a With<F, Self>.
source§

unsafe fn resolve_with( field: &Mutex<F>, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived )

Resolves the archived type using a reference to the field type F. Read more
source§

impl<F: Archive> ArchiveWith<RwLock<F>> for Lock

§

type Archived = Immutable<<F as Archive>::Archived>

The archived type of a With<F, Self>.
§

type Resolver = <F as Archive>::Resolver

The resolver of a With<F, Self>.
source§

unsafe fn resolve_with( field: &RwLock<F>, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived )

Resolves the archived type using a reference to the field type F. Read more
source§

impl Debug for Lock

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<F, T, D> DeserializeWith<Immutable<F>, Mutex<T>, D> for Lock
where F: Deserialize<T, D>, D: Fallible + ?Sized,

source§

fn deserialize_with( field: &Immutable<F>, deserializer: &mut D ) -> Result<Mutex<T>, D::Error>

Deserializes the field type F using the given deserializer.
source§

impl<F, T, D> DeserializeWith<Immutable<F>, RwLock<T>, D> for Lock
where F: Deserialize<T, D>, D: Fallible + ?Sized,

source§

fn deserialize_with( field: &Immutable<F>, deserializer: &mut D ) -> Result<RwLock<T>, D::Error>

Deserializes the field type F using the given deserializer.
source§

impl<F: Serialize<S>, S: Fallible + ?Sized> SerializeWith<Mutex<F>, S> for Lock
where S::Error: From<LockError>,

source§

fn serialize_with( field: &Mutex<F>, serializer: &mut S ) -> Result<Self::Resolver, S::Error>

Serializes the field type F using the given serializer.
source§

impl<F: Serialize<S>, S: Fallible + ?Sized> SerializeWith<RwLock<F>, S> for Lock
where S::Error: From<LockError>,

source§

fn serialize_with( field: &RwLock<F>, serializer: &mut S ) -> Result<Self::Resolver, S::Error>

Serializes the field type F using the given serializer.

Auto Trait Implementations§

§

impl RefUnwindSafe for Lock

§

impl Send for Lock

§

impl Sync for Lock

§

impl Unpin for Lock

§

impl UnwindSafe for Lock

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> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
source§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
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
source§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where W: DeserializeWith<F, T, D>, D: Fallible + ?Sized, F: ?Sized,

source§

fn deserialize( &self, deserializer: &mut D ) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

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.

source§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
source§

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

§

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.
source§

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

§

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.