pub struct PlanConstraints {
    pub collects_garbage: bool,
    pub moves_objects: bool,
    pub max_non_los_default_alloc_bytes: usize,
    pub max_non_los_copy_bytes: usize,
    pub needs_log_bit: bool,
    pub may_trace_duplicate_edges: bool,
    pub barrier: BarrierSelector,
    pub needs_linear_scan: bool,
    pub needs_concurrent_workers: bool,
    pub needs_forward_after_liveness: bool,
    pub needs_prepare_mutator: bool,
}
Expand description

This struct defines plan-specific constraints. Most of the constraints are constants. Each plan should declare a constant of this struct, and use the constant wherever possible. However, for plan-neutral implementations, these constraints are not constant.

Fields§

§collects_garbage: bool

Does the plan collect garbage? Obviously most plans do, but NoGC does not collect.

§moves_objects: bool

True if the plan moves objects.

§max_non_los_default_alloc_bytes: usize

Size (in bytes) beyond which new regular objects must be allocated to the LOS. This usually depends on the restriction of the default allocator, e.g. block size for Immix, nursery size, max possible cell for freelist, etc.

§max_non_los_copy_bytes: usize

Size (in bytes) beyond which copied objects must be copied to the LOS. This depends on the copy allocator.

§needs_log_bit: bool

Does this plan use the log bit? See vm::ObjectModel::GLOBAL_LOG_BIT_SPEC.

§may_trace_duplicate_edges: bool

Some plans may allow benign race for testing mark bit, and this will lead to trace the same edge multiple times. If a plan allows tracing duplicated edges, we will not run duplicate edge check in extreme_assertions.

Note: Both crate::vm::Scanning::scan_object (which enqueues slots) and crate::vm::Scanning::scan_object_and_trace_edges (which traces the targets directly) are affected by such benign races. But our current duplicate edge check in extreme_assertions only identifies duplicated slots.

§barrier: BarrierSelector

The barrier this plan uses. A binding may check this and know what kind of write barrier is in use if they would like to implement the barrier fast path in the binding side.

§needs_linear_scan: bool

True if this plan requires linear scanning. This is unused and may be incorrect.

§needs_concurrent_workers: bool

True if this plan requires concurrent worker threads. This is unused and may be incorrect.

§needs_forward_after_liveness: bool

Some policies do object forwarding after the first liveness transitive closure, such as mark compact. For plans that use those policies, they should set this as true.

§needs_prepare_mutator: bool

Some (in fact, most) plans do nothing when preparing mutators before tracing (i.e. in MutatorConfig::prepare_func). Those plans can set this to false so that the PrepareMutator work packets will not be created at all.

Implementations§

source§

impl PlanConstraints

source

pub const fn default() -> Self

A const function to create the default plan constraints.

Auto Trait Implementations§

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> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
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> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. 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.