Struct CpuLocalCell

Source
pub struct CpuLocalCell<T: 'static>(UnsafeCell<T>);
Expand description

Inner mutable CPU-local objects.

CPU-local cell objects are only accessible from the current CPU. When accessing an underlying object using the same CpuLocalCell instance, the actually accessed object is always on the current CPU. So in a preemptive kernel task, the operated object may change if interrupts are enabled.

The inner mutability is provided by single instruction operations, and the CPU-local cell objects will not ever be shared between CPUs. So it is safe to modify the inner value without any locks.

You should only create the CPU-local cell object using the macro cpu_local_cell!.

Please exercise extreme caution when using CpuLocalCell. In most cases, it is necessary to disable interrupts or preemption when using it to prevent the operated object from being changed, which can lead to race conditions.

For the difference between super::CpuLocal and CpuLocalCell, see super.

Tuple Fields§

§0: UnsafeCell<T>

Implementations§

Source§

impl<T: 'static> CpuLocalCell<T>

Source

pub fn as_mut_ptr(&'static self) -> *mut T

Gets access to the underlying value through a raw pointer.

This function calculates the virtual address of the CPU-local object based on the CPU-local base address and the offset in the BSP.

This method is safe, but using the returned pointer will be unsafe. Specifically,

  • Preemption should be disabled from the time this method is called to the time the pointer is used. Otherwise, the pointer may point to the variable on another CPU, making it difficult or impossible to determine if the data can be borrowed.
  • If the variable can be used in interrupt handlers, borrowing the data should be done with interrupts disabled. Otherwise, more care must be taken to ensure that the borrowing rules are correctly enforced, since the interrupts may come asynchronously.
Source§

impl<T: 'static + SingleInstructionAddAssign<T>> CpuLocalCell<T>

Source

pub fn add_assign(&'static self, rhs: T)

Adds a value to the per-CPU object in a single instruction.

This operation wraps on overflow/underflow.

Note that this memory operation will not be elided or reordered by the compiler since it is a black-box.

Source§

impl<T: 'static + SingleInstructionSubAssign<T>> CpuLocalCell<T>

Source

pub fn sub_assign(&'static self, rhs: T)

Subtracts a value to the per-CPU object in a single instruction.

This operation wraps on overflow/underflow.

Note that this memory operation will not be elided or reordered by the compiler since it is a black-box.

Source§

impl<T: 'static + SingleInstructionBitAndAssign<T>> CpuLocalCell<T>

Source

pub fn bitand_assign(&'static self, rhs: T)

Bitwise ANDs a value to the per-CPU object in a single instruction.

Note that this memory operation will not be elided or reordered by the compiler since it is a black-box.

Source§

impl<T: 'static + SingleInstructionBitOrAssign<T>> CpuLocalCell<T>

Source

pub fn bitor_assign(&'static self, rhs: T)

Bitwise ORs a value to the per-CPU object in a single instruction.

Note that this memory operation will not be elided or reordered by the compiler since it is a black-box.

Source§

impl<T: 'static + SingleInstructionBitXorAssign<T>> CpuLocalCell<T>

Source

pub fn bitxor_assign(&'static self, rhs: T)

Bitwise XORs a value to the per-CPU object in a single instruction.

Note that this memory operation will not be elided or reordered by the compiler since it is a black-box.

Source§

impl<T: 'static + SingleInstructionLoad> CpuLocalCell<T>

Source

pub fn load(&'static self) -> T

Gets the value of the per-CPU object in a single instruction.

Note that this memory operation will not be elided or reordered by the compiler since it is a black-box.

Source§

impl<T: 'static + SingleInstructionStore> CpuLocalCell<T>

Source

pub fn store(&'static self, val: T)

Writes a value to the per-CPU object in a single instruction.

Note that this memory operation will not be elided or reordered by the compiler since it is a black-box.

Trait Implementations§

Source§

impl<T: 'static> !Clone for CpuLocalCell<T>

Source§

impl<T: 'static> !Copy for CpuLocalCell<T>

Source§

impl<T: 'static> !Send for CpuLocalCell<T>

Source§

impl<T: 'static> Sync for CpuLocalCell<T>

Auto Trait Implementations§

§

impl<T> !Freeze for CpuLocalCell<T>

§

impl<T> !RefUnwindSafe for CpuLocalCell<T>

§

impl<T> Unpin for CpuLocalCell<T>
where T: Unpin,

§

impl<T> UnwindSafe for CpuLocalCell<T>
where T: 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> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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.

§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointee for T

§

type Metadata = ()

The metadata type for pointers and references to this type.
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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.