diff --git a/src/policy/immix/immixspace.rs b/src/policy/immix/immixspace.rs index 0566050aae..393a63179d 100644 --- a/src/policy/immix/immixspace.rs +++ b/src/policy/immix/immixspace.rs @@ -14,7 +14,7 @@ use crate::util::heap::HeapMeta; use crate::util::heap::PageResource; use crate::util::heap::VMRequest; use crate::util::metadata::side_metadata::{self, *}; -use crate::util::metadata::{self, compare_exchange_metadata, load_metadata, MetadataSpec}; +use crate::util::metadata::{self, compare_exchange_metadata, load_metadata, MetadataSpec, store_metadata}; use crate::util::object_forwarding as ForwardingWord; use crate::util::{Address, ObjectReference}; use crate::vm::*; @@ -87,6 +87,15 @@ impl SFT for ImmixSpace { ) -> ObjectReference { panic!("We do not use SFT to trace objects for Immix. sft_trace_object() cannot be used.") } + #[inline(always)] + fn get_forwarded_object(&self, object: ObjectReference) -> Option { + debug_assert!(!object.is_null()); + if ForwardingWord::is_forwarded::(object) { + Some(ForwardingWord::read_forwarding_pointer::(object)) + } else { + None + } + } } impl Space for ImmixSpace { @@ -649,6 +658,16 @@ impl PolicyCopyContext for ImmixCopyContext { self.copy_allocator.alloc(bytes, align, offset) } } + #[inline(always)] + fn post_copy(&mut self, object: ObjectReference, _bytes: usize) { + store_metadata::( + &VM::VMObjectModel::LOCAL_MARK_BIT_SPEC, + object, + self.defrag_allocator.immix_space().mark_state as _, + None, + None, + ); + } } impl ImmixCopyContext {