Struct deno_core::arena::ArenaShared
source · pub struct ArenaShared<T> { /* private fields */ }
Expand description
An atomic reference-counted pointer into an arena-allocated object with thread-safe allocation and deallocation capabilities.
This structure ensures atomic access and safe sharing of allocated data across multiple threads while maintaining reference counting to manage the memory deallocation when no longer needed.
It combines a thread-safe RawArena
for allocation and deallocation
and provides a mutex to guarantee exclusive access to the internal
data for safe multi-threaded operation.
The ArenaShared
allows multiple threads to allocate, share,
and deallocate objects within the arena, ensuring safety and atomicity
during these operations.
Implementations§
sourcepub const fn overhead() -> usize
pub const fn overhead() -> usize
Returns the constant overhead per allocation to assist with making allocations page-aligned.
sourcepub const fn allocation_size() -> usize
pub const fn allocation_size() -> usize
Returns the size of each allocation.
pub fn with_capacity(capacity: usize) -> Self
sourcepub fn allocate(&self, data: T) -> ArenaRc<T>
pub fn allocate(&self, data: T) -> ArenaRc<T>
Allocates a new object in the arena and returns an ArenaRc
pointing to it.
This method creates a new instance of type T
within the RawArena
. The provided data
is initialized within the arena, and an ArenaRc
is returned to manage this allocated data.
The ArenaRc
serves as an atomic, reference-counted pointer to the allocated data within
the arena, ensuring safe concurrent access across multiple threads while maintaining the
reference count for memory management.
The allocation process employs a mutex to ensure thread-safe access to the arena, allowing only one thread at a time to modify the internal state, including allocating and deallocating memory.
§Safety
The provided data
is allocated within the arena and managed by the ArenaRc
. Improper handling
or misuse of the returned ArenaRc
pointer may lead to memory leaks or memory unsafety.
§Example
// Define a struct that will be allocated within the arena
struct MyStruct {
data: usize,
}
// Create a new instance of ArenaShared with a specified base capacity
let arena: ArenaShared<MyStruct> = ArenaShared::with_capacity(16);
// Allocate a new MyStruct instance within the arena
let data_instance = MyStruct { data: 42 };
let allocated_arc = arena.allocate(data_instance);
// Now, allocated_arc can be used as a managed reference to the allocated data
assert_eq!(allocated_arc.data, 42); // Validate the data stored in the allocated arc
sourcepub fn allocate_if_space(&self, data: T) -> Result<ArenaRc<T>, T>
pub fn allocate_if_space(&self, data: T) -> Result<ArenaRc<T>, T>
Allocates a new object in the arena and returns an ArenaRc
pointing to it. If no space
is available, returns the original object.
This method creates a new instance of type T
within the RawArena
. The provided data
is initialized within the arena, and an ArenaRc
is returned to manage this allocated data.
The ArenaRc
serves as an atomic, reference-counted pointer to the allocated data within
the arena, ensuring safe concurrent access across multiple threads while maintaining the
reference count for memory management.
The allocation process employs a mutex to ensure thread-safe access to the arena, allowing only one thread at a time to modify the internal state, including allocating and deallocating memory.
sourcepub unsafe fn reserve_space(&self) -> Option<ArenaSharedReservation<T>>
pub unsafe fn reserve_space(&self) -> Option<ArenaSharedReservation<T>>
Attempt to reserve space in this arena.
§Safety
Reservations must be either completed or forgotten, and must be provided to the same arena that created them.
sourcepub unsafe fn forget_reservation(&self, reservation: ArenaSharedReservation<T>)
pub unsafe fn forget_reservation(&self, reservation: ArenaSharedReservation<T>)
Forget a reservation.
§Safety
Reservations must be either completed or forgotten, and must be provided to the same arena that created them.
sourcepub unsafe fn complete_reservation(
&self,
reservation: ArenaSharedReservation<T>,
data: T
) -> ArenaRc<T>
pub unsafe fn complete_reservation( &self, reservation: ArenaSharedReservation<T>, data: T ) -> ArenaRc<T>
Complete a reservation.
§Safety
Reservations must be either completed or forgotten, and must be provided to the same arena that created them.
Trait Implementations§
Auto Trait Implementations§
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> FmtForward for T
impl<T> FmtForward for T
source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.source§impl<T> Tap for T
impl<T> Tap for T
source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moresource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moresource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moresource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moresource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.