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

§

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.