pub struct ImmixSpace<VM: VMBinding> {
    common: CommonSpace<VM>,
    pr: BlockPageResource<VM, Block>,
    pub chunk_map: ChunkMap,
    pub line_mark_state: AtomicU8,
    line_unavail_state: AtomicU8,
    pub reusable_blocks: ReusableBlockPool,
    pub(super) defrag: Defrag,
    lines_consumed: AtomicUsize,
    mark_state: u8,
    scheduler: Arc<GCWorkScheduler<VM>>,
    space_args: ImmixSpaceArgs,
}

Fields§

§common: CommonSpace<VM>§pr: BlockPageResource<VM, Block>§chunk_map: ChunkMap

Allocation status for all chunks in immix space

§line_mark_state: AtomicU8

Current line mark state

§line_unavail_state: AtomicU8

Line mark state in previous GC

§reusable_blocks: ReusableBlockPool

A list of all reusable blocks

§defrag: Defrag

Defrag utilities

§lines_consumed: AtomicUsize

How many lines have been consumed since last GC?

§mark_state: u8

Object mark state

§scheduler: Arc<GCWorkScheduler<VM>>

Work packet scheduler

§space_args: ImmixSpaceArgs

Some settings for this space

Implementations§

source§

impl<VM: VMBinding> ImmixSpace<VM>

source

const UNMARKED_STATE: u8 = 0u8

source

const MARKED_STATE: u8 = 1u8

source

fn side_metadata_specs() -> Vec<SideMetadataSpec>

Get side metadata specs

source

pub fn new( args: PlanCreateSpaceArgs<'_, VM>, space_args: ImmixSpaceArgs ) -> Self

source

pub fn flush_page_resource(&self)

Flush the thread-local queues in BlockPageResource

source

pub fn defrag_headroom_pages(&self) -> usize

Get the number of defrag headroom pages.

source

pub fn in_defrag(&self) -> bool

Check if current GC is a defrag GC.

source

pub fn decide_whether_to_defrag( &self, emergency_collection: bool, collect_whole_heap: bool, collection_attempts: usize, user_triggered_collection: bool, full_heap_system_gc: bool ) -> bool

check if the current GC should do defragmentation.

source

fn scheduler(&self) -> &GCWorkScheduler<VM>

Get work packet scheduler

source

pub fn prepare(&mut self, major_gc: bool, plan_stats: StatsForDefrag)

source

pub fn release(&mut self, major_gc: bool)

Release for the immix space.

source

pub fn end_of_gc(&mut self) -> bool

This is called when a GC finished. Return whether this GC was a defrag GC, as a plan may want to know this.

source

fn generate_sweep_tasks(&self) -> Vec<Box<dyn GCWork<VM>>>

Generate chunk sweep tasks

source

pub fn release_block(&self, block: Block)

Release a block.

source

pub fn get_clean_block(&self, tls: VMThread, copy: bool) -> Option<Block>

Allocate a clean block.

source

pub fn get_reusable_block(&self, copy: bool) -> Option<Block>

Pop a reusable block from the reusable block list.

source

pub fn trace_object_without_moving( &self, queue: &mut impl ObjectQueue, object: ObjectReference ) -> ObjectReference

Trace and mark objects without evacuation.

source

pub fn trace_object_with_opportunistic_copy( &self, queue: &mut impl ObjectQueue, object: ObjectReference, semantics: CopySemantics, worker: &mut GCWorker<VM>, nursery_collection: bool ) -> ObjectReference

Trace object and do evacuation if required.

source

fn unlog_object_if_needed(&self, object: ObjectReference)

source

pub fn mark_lines(&self, object: ObjectReference)

Mark all the lines that the given object spans.

source

fn attempt_mark(&self, object: ObjectReference, mark_state: u8) -> bool

Atomically mark an object.

source

fn is_marked_with(&self, object: ObjectReference, mark_state: u8) -> bool

Check if an object is marked.

source

pub(crate) fn is_marked(&self, object: ObjectReference) -> bool

source

fn is_pinned(&self, _object: ObjectReference) -> bool

Check if an object is pinned.

source

pub fn get_next_available_lines( &self, search_start: Line ) -> Option<(Line, Line)>

Hole searching.

Linearly scan lines in a block to search for the next hole, starting from the given line. If we find available lines, return a tuple of the start line and the end line (non-inclusive).

Returns None if the search could not find any more holes.

source

pub fn is_last_gc_exhaustive(did_defrag_for_last_gc: bool) -> bool

source

pub(crate) fn get_pages_allocated(&self) -> usize

source

fn post_copy(&self, object: ObjectReference, _bytes: usize)

Post copy routine for Immix copy contexts

Trait Implementations§

source§

impl<VM: VMBinding> PolicyTraceObject<VM> for ImmixSpace<VM>

source§

fn trace_object<Q: ObjectQueue, const KIND: u8>( &self, queue: &mut Q, object: ObjectReference, copy: Option<CopySemantics>, worker: &mut GCWorker<VM> ) -> ObjectReference

Trace object in the policy. If the policy copies objects, we should expect copy to be a Some value.
source§

fn post_scan_object(&self, object: ObjectReference)

Policy-specific post-scan-object hook. It is called after scanning each object in this space.
source§

fn may_move_objects<const KIND: u8>() -> bool

Return whether the policy moves objects.
source§

impl<VM: VMBinding> SFT for ImmixSpace<VM>

source§

fn name(&self) -> &str

The space name
source§

fn get_forwarded_object( &self, object: ObjectReference ) -> Option<ObjectReference>

Get forwarding pointer if the object is forwarded.
source§

fn is_live(&self, object: ObjectReference) -> bool

Is the object live, determined by the policy?
source§

fn pin_object(&self, object: ObjectReference) -> bool

source§

fn unpin_object(&self, object: ObjectReference) -> bool

source§

fn is_object_pinned(&self, object: ObjectReference) -> bool

source§

fn is_movable(&self) -> bool

Is the object movable, determined by the policy? E.g. the policy is non-moving, or the object is pinned.
source§

fn is_sane(&self) -> bool

Is the object sane? A policy should return false if there is any abnormality about object - the sanity checker will fail if an object is not sane.
source§

fn initialize_object_metadata(&self, _object: ObjectReference, _alloc: bool)

Initialize object metadata (in the header, or in the side metadata).
source§

fn is_mmtk_object(&self, addr: Address) -> Option<ObjectReference>

Is addr a valid object reference to an object allocated in this space? This default implementation works for all spaces that use MMTk’s mapper to allocate memory. Some spaces, like MallocSpace, use third-party libraries to allocate memory. Such spaces needs to override this method.
source§

fn find_object_from_internal_pointer( &self, ptr: Address, max_search_bytes: usize ) -> Option<ObjectReference>

source§

fn sft_trace_object( &self, _queue: &mut VectorObjectQueue, _object: ObjectReference, _worker: GCWorkerMutRef<'_> ) -> ObjectReference

Trace objects through SFT. This along with SFTProcessEdges provides an easy way for most plans to trace objects without the need to implement any plan-specific code. However, tracing objects for some policies are more complicated, and they do not provide an implementation of this method. For example, mark compact space requires trace twice in each GC. Immix has defrag trace and fast trace.
source§

fn is_reachable(&self, object: ObjectReference) -> bool

Is the object reachable, determined by the policy? Note: Objects in ImmortalSpace may have is_live = true but are actually unreachable.
source§

fn is_in_space(&self, _object: ObjectReference) -> bool

Is the object managed by MMTk? For most cases, if we find the sft for an object, that means the object is in the space and managed by MMTk. However, for some spaces, like MallocSpace, we mark the entire chunk in the SFT table as a malloc space, but only some of the addresses in the space contain actual MMTk objects. So they need a further check.
source§

impl<VM: VMBinding> Space<VM> for ImmixSpace<VM>

source§

fn as_space(&self) -> &dyn Space<VM>

source§

fn as_sft(&self) -> &(dyn SFT + Sync + 'static)

source§

fn get_page_resource(&self) -> &dyn PageResource<VM>

source§

fn maybe_get_page_resource_mut(&mut self) -> Option<&mut dyn PageResource<VM>>

Get a mutable reference to the underlying page resource, or None if the space does not have a page resource.
source§

fn common(&self) -> &CommonSpace<VM>

source§

fn initialize_sft(&self, sft_map: &mut dyn SFTMap)

Initialize entires in SFT map for the space. This is called when the Space object has a non-moving address, as we will use the address to set sft. Currently after we create a boxed plan, spaces in the plan have a non-moving address.
source§

fn release_multiple_pages(&mut self, _start: Address)

source§

fn set_copy_for_sft_trace(&mut self, _semantics: Option<CopySemantics>)

What copy semantic we should use for this space if we copy objects from this space. This is only needed for plans that use SFTProcessEdges
source§

fn enumerate_objects(&self, enumerator: &mut dyn ObjectEnumerator)

Enumerate objects in the current space. Read more
source§

fn will_oom_on_acquire(&self, tls: VMThread, size: usize) -> bool

A check for the obvious out-of-memory case: if the requested size is larger than the heap size, it is definitely an OOM. We would like to identify that, and allows the binding to deal with OOM. Without this check, we will attempt to allocate from the page resource. If the requested size is unrealistically large (such as usize::MAX), it breaks the assumptions of our implementation of page resource, vm map, etc. This check prevents that, and allows us to handle the OOM case. Each allocator that may request an arbitrary size should call this method before acquring memory from the space. For example, bump pointer allocator and large object allocator need to call this method. On the other hand, allocators that only allocate memory in fixed size blocks do not need to call this method. An allocator should call this method before doing any computation on the size to avoid arithmatic overflow. If we have to do computation in the allocation fastpath and overflow happens there, there is nothing we can do about it. Return a boolean to indicate if we will be out of memory, determined by the check.
source§

fn acquire(&self, tls: VMThread, pages: usize) -> Address

source§

fn address_in_space(&self, start: Address) -> bool

source§

fn in_space(&self, object: ObjectReference) -> bool

source§

fn grow_space(&self, start: Address, bytes: usize, new_chunk: bool)

This is called after we get result from page resources. The space may tap into the hook to monitor heap growth. The call is made from within the page resources’ critical region, immediately before yielding the lock. Read more
source§

fn ensure_mapped(&self)

Ensure this space is marked as mapped – used when the space is already mapped (e.g. for a vm image which is externally mmapped.)
source§

fn reserved_pages(&self) -> usize

source§

fn available_physical_pages(&self) -> usize

Return the number of physical pages available.
source§

fn get_name(&self) -> &'static str

source§

fn get_gc_trigger(&self) -> &GCTrigger<VM>

source§

fn verify_side_metadata_sanity( &self, side_metadata_sanity_checker: &mut SideMetadataSanity )

Ensure that the current space’s metadata context does not have any issues. Panics with a suitable message if any issue is detected. It also initialises the sanity maps which will then be used if the extreme_assertions feature is active. Internally this calls verify_metadata_context() from util::metadata::sanity Read more
source§

impl<VM: VMBinding> Sync for ImmixSpace<VM>

Auto Trait Implementations§

§

impl<VM> !RefUnwindSafe for ImmixSpace<VM>

§

impl<VM> Send for ImmixSpace<VM>

§

impl<VM> Unpin for ImmixSpace<VM>
where VM: Unpin,

§

impl<VM> !UnwindSafe for ImmixSpace<VM>

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.