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,
pub generational: 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: boolDoes the plan collect garbage? Obviously most plans do, but NoGC does not collect.
moves_objects: boolTrue if the plan moves objects.
max_non_los_default_alloc_bytes: usizeSize (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: usizeSize (in bytes) beyond which copied objects must be copied to the LOS. This depends on the copy allocator.
needs_log_bit: boolDoes this plan use the log bit? See vm::ObjectModel::GLOBAL_LOG_BIT_SPEC.
may_trace_duplicate_edges: boolSome 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: BarrierSelectorThe 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: boolTrue if this plan requires linear scanning. This is unused and may be incorrect.
needs_concurrent_workers: boolTrue if this plan requires concurrent worker threads. This is unused and may be incorrect.
needs_forward_after_liveness: boolSome 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: boolSome (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.
generational: boolIs this plan generational?
Implementations§
Auto Trait Implementations§
impl Freeze for PlanConstraints
impl RefUnwindSafe for PlanConstraints
impl Send for PlanConstraints
impl Sync for PlanConstraints
impl Unpin for PlanConstraints
impl UnwindSafe for PlanConstraints
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
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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