Struct deno_core::arena::RawArena

source ·
pub struct RawArena<T> { /* private fields */ }
Expand description

A very-unsafe, arena for raw pointers that falls back to raw allocation when full. This should be used with great care, and ideally you should only be using the higher-level arenas built on top of this.

§Safety

Items placed into the RawArena are dropped, but there is no check to ensure that an allocated item is valid before dropping it. Use recycle_without_drop to return an item to the arena without dropping it.

§Example

// Create a RawArena with a capacity of 10 elements
let arena = RawArena::<usize>::with_capacity(10);

// Allocate elements in the arena
unsafe {
  let mut elements = Vec::new();
  for i in 0..10 {
    let mut element_ptr = arena.allocate();
    *element_ptr.as_mut() = i * 2;
    elements.push(element_ptr);
  }

  // Recycle elements back into the arena
  for &element_ptr in elements.iter() {
    arena.recycle(element_ptr);
  }
}

Implementations§

source§

impl<T> RawArena<T>

source

pub const fn overhead() -> usize

Returns the constant overhead per allocation to assist with making allocations page-aligned.

source

pub const fn allocation_size() -> usize

Returns the size of each allocation.

source

pub fn with_capacity(capacity: usize) -> Self

Allocate an arena, completely initialized. This memory is not zeroed, and we use the high-water mark to keep track of what we’ve initialized so far.

This is safe, because dropping the RawArena without doing anything to it is safe.

source

pub unsafe fn allocate(&self) -> NonNull<T>

Gets the next free entry, allocating if necessary. This is O(1) if we have free space in the arena, O(?) if we need to allocate from the allocator (where ? is defined by the system allocator).

§Safety

As the memory area is considered uninitialized and you must be careful to fully and validly initialize the underlying data, this method is marked as unsafe.

This pointer will be invalidated when we drop the RawArena, so the allocator API is unsafe as there are no lifetimes here.

IMPORTANT: Ensure all allocated entries are fully initialized before dropping RawArena, or use recycle_without_drop to manually handle recycling, as dropping the arena does not perform any validation or cleanup on the allocated items. Dropping RawArena will automatically trigger the drop of all items allocated within.

source

pub unsafe fn allocate_if_space(&self) -> Option<NonNull<T>>

Gets the next free entry, returning null if full. This is O(1).

§Safety

As the memory area is considered uninitialized and you must be careful to fully and validly initialize the underlying data, this method is marked as unsafe.

This pointer will be invalidated when we drop the RawArena, so the allocator API is unsafe as there are no lifetimes here.

IMPORTANT: Ensure all allocated entries are fully initialized before dropping RawArena, or use recycle_without_drop to manually handle recycling, as dropping the arena does not perform any validation or cleanup on the allocated items. Dropping RawArena will automatically trigger the drop of all items allocated within.

source

pub fn remaining(&self) -> usize

Returns the remaining capacity of this RawArena that can be provided without allocation.

source

pub fn allocated(&self) -> usize

Returns the remaining capacity of this RawArena that can be provided without allocation.

source

pub unsafe fn clear_allocated(&self)

Clear all internally-allocated entries, resetting the arena state to its original state. Any non-vacant entries are dropped.

This operation must walk the vacant list and is worst-case O(n), where n is the largest size of this arena since the last clear operation.

§Safety

Does not clear system-allocator entries. Pointers previously allocated may still be in use.

source

pub unsafe fn recycle(&self, data: NonNull<T>) -> bool

Recycle a used item, returning it to the next-free list. Drops the associated item in place before recycling.

§Safety

We assume this pointer is either internal to the arena (in which case we return it to the arena), or allocated via std::alloc::alloc in allocate.

source

pub unsafe fn recycle_without_drop(&self, data: NonNull<T>) -> bool

Recycle a used item, returning it to the next-free list.

§Safety

We assume this pointer is either internal to the arena (in which case we return it to the arena), or allocated via std::alloc::alloc in allocate.

Trait Implementations§

source§

impl<T> Drop for RawArena<T>

source§

fn drop(&mut self)

Drop the arena. All pointers are invalidated at this point, except for those allocated outside outside of the arena.

The allocation APIs are unsafe because we don’t track lifetimes here.

source§

impl<T> Send for RawArena<T>

The RawArena is Send, but not Sync.

Auto Trait Implementations§

§

impl<T> !Freeze for RawArena<T>

§

impl<T> !RefUnwindSafe for RawArena<T>

§

impl<T> !Sync for RawArena<T>

§

impl<T> Unpin for RawArena<T>

§

impl<T> UnwindSafe for RawArena<T>
where T: RefUnwindSafe,

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

source§

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

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

impl<T> FmtForward for T

source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

source§

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

source§

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

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

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

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

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

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

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

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

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

impl<T> Tap for T

source§

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

Immutable access to a value. Read more
source§

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

Mutable access to a value. Read more
source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

impl<T> TryConv for T

source§

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>,

§

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.