enum VOBitUpdateStrategy {
ClearAndReconstruct,
CopyFromMarkBits,
}
Expand description
The strategy to update the valid object (VO) bits.
Each stategy has its strength and limitation. We should choose a strategy according to the configuration of the VM binding.
Current experiments show that the CopyFromMarkBits
strategy is faster while also makes the
VO bits available during tracing. We also include the ClearAndReconstruct
strategy because
- It was the strategy described in the original paper that described the algorithm for filtering roots using VO bits for stack-conservative GC. See: Fast Conservative Garbage Collection published in OOPSLA’14 https://dl.acm.org/doi/10.1145/2660193.2660198
- It does not require mark bits to be on the side. It will be needed if we implement in-header mark bits in the future.
Variants§
ClearAndReconstruct
Clear all VO bits after stacks are scanned, and reconstruct the VO bits during tracing.
Pros:
- Proven to work by published paper.
Cons:
- VO bits are not available during tracing.
CopyFromMarkBits
Copy the mark bits metadata over to the VO bits metadata after tracing.
Pros:
- VO bits are available during tracing.
- Faster according to current experiment.
Cons:
- Requires marking bits to be on the side.
Implementations§
source§impl VOBitUpdateStrategy
impl VOBitUpdateStrategy
sourcepub fn vo_bit_available_during_tracing(&self) -> bool
pub fn vo_bit_available_during_tracing(&self) -> bool
Return true
if the VO bit metadata is available during tracing.
Trait Implementations§
Auto Trait Implementations§
impl RefUnwindSafe for VOBitUpdateStrategy
impl Send for VOBitUpdateStrategy
impl Sync for VOBitUpdateStrategy
impl Unpin for VOBitUpdateStrategy
impl UnwindSafe for VOBitUpdateStrategy
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
Mutably borrows from an owned value. Read more
§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>
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>
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)
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)
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
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>
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 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>
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