Lock

Struct Lock 

Source
pub struct Lock<'a> { /* private fields */ }
Expand description

A sophisticated lock implementation designed for concurrent cuckoo filter operations.

This is NOT a traditional mutex but an atomic-based synchronization mechanism that enables three distinct concurrency modes:

  1. Optimistic locks: Allow maximum concurrency - multiple readers and writers can proceed simultaneously. Used for optimistic reads that detect data races.

  2. WriterExclusive locks: Mutual exclusion among writers only - prevents concurrent modifications but allows concurrent reads.

  3. FullyExclusive locks: Complete mutual exclusion - blocks all operations. Only used during complex eviction chains to ensure consistency.

§Version Encoding Scheme

The atomic usize encodes both lock state and version information:

  • Bits 0-1: Lock kind (0=Optimistic, 1=WriterExclusive, 2=FullyExclusive)
  • Bits 2-63: Version counter (incremented on FullyExclusive release)

This allows optimistic readers to detect when their read might be stale by comparing version numbers before and after the operation.

Trait Implementations§

Source§

impl Drop for Lock<'_>

Source§

fn drop(&mut self)

Release the lock when it goes out of scope

Auto Trait Implementations§

§

impl<'a> Freeze for Lock<'a>

§

impl<'a> RefUnwindSafe for Lock<'a>

§

impl<'a> Send for Lock<'a>

§

impl<'a> Sync for Lock<'a>

§

impl<'a> Unpin for Lock<'a>

§

impl<'a> UnwindSafe for Lock<'a>

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
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, 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.
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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V