/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Common Public License (CPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/cpl1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.mmtk.vm;
import org.mmtk.plan.TraceLocal;
import org.mmtk.plan.TransitiveClosure;
import org.mmtk.utility.Constants;
import org.vmmagic.pragma.Uninterruptible;
import org.vmmagic.unboxed.*;
@Uninterruptible public abstract class Scanning implements Constants {
/**
* Delegated scanning of a object, processing each pointer field
* encountered.
*
* @param object The object to be scanned.
*/
public abstract void scanObject(TransitiveClosure trace, ObjectReference object);
/**
* Invoke a specialized scan method. Note that these methods must have been allocated
* explicitly through Plan and PlanConstraints.
*
* @param id The specialized method id
* @param trace The trace the method has been specialized for
* @param object The object to be scanned
*/
public abstract void specializedScanObject(int id, TransitiveClosure trace, ObjectReference object);
/**
* Delegated precopying of a object's children, processing each pointer field
* encountered.
*
* @param trace The trace object to use for precopying.
* @param object The object to be scanned.
*/
public abstract void precopyChildren(TraceLocal trace, ObjectReference object);
/**
* Prepares for using the <code>computeAllRoots</code> method. The
* thread counter allows multiple GC threads to co-operatively
* iterate through the thread data structure (if load balancing
* parallel GC threads were not important, the thread counter could
* simply be replaced by a for loop).
*/
public abstract void resetThreadCounter();
/**
* Pre-copy all potentially movable instances used in the course of
* GC. This includes the thread objects representing the GC threads
* themselves. It is crucial that these instances are forwarded
* <i>prior</i> to the GC proper. Since these instances <i>are
* not</i> enqueued for scanning, it is important that when roots
* are computed the same instances are explicitly scanned and
* included in the set of roots. The existence of this method
* allows the actions of calculating roots and forwarding GC
* instances to be decoupled.
*/
public abstract void preCopyGCInstances(TraceLocal trace);
/**
* Computes static roots. This method establishes all such roots for
* collection and places them in the root locations queue. This method
* should not have side effects (such as copying or forwarding of
* objects). There are a number of important preconditions:
*
* <ul>
* <li> All objects used in the course of GC (such as the GC thread
* objects) need to be "pre-copied" prior to calling this method.
* <li> The <code>threadCounter</code> must be reset so that load
* balancing parallel GC can share the work of scanning threads.
* </ul>
*
* @param trace The trace to use for computing roots.
*/
public abstract void computeStaticRoots(TraceLocal trace);
/**
* Computes roots pointed to by threads, their associated registers
* and stacks. This method places these roots in the root values,
* root locations and interior root locations queues. This method
* should not have side effects (such as copying or forwarding of
* objects). There are a number of important preconditions:
*
* <ul>
* <li> All objects used in the course of GC (such as the GC thread
* objects) need to be "pre-copied" prior to calling this method.
* <li> The <code>threadCounter</code> must be reset so that load
* balancing parallel GC can share the work of scanning threads.
* </ul>
*
* @param trace The trace to use for computing roots.
*/
public abstract void computeThreadRoots(TraceLocal trace);
/**
* Compute all roots out of the VM's boot image (if any). This method is a no-op
* in the case where the VM does not maintain an MMTk-visible Java space. However,
* when the VM does maintain a space (such as a boot image) which is visible to MMTk,
* that space could either be scanned by MMTk as part of its transitive closure over
* the whole heap, or as a (considerable) performance optimization, MMTk could avoid
* scanning the space if it is aware of all pointers out of that space. This method
* is used to establish the root set out of the scannable space in the case where
* such a space exists.
*
* @param trace The trace object to use to report root locations.
*/
public abstract void computeBootImageRoots(TraceLocal trace);
}