org.mmtk.plan.stickyms
Class StickyMSMutator

java.lang.Object
  extended by org.mmtk.plan.MutatorContext
      extended by org.mmtk.plan.SimpleMutator
          extended by org.mmtk.plan.StopTheWorldMutator
              extended by org.mmtk.plan.marksweep.MSMutator
                  extended by org.mmtk.plan.stickyms.StickyMSMutator
All Implemented Interfaces:
Constants

public class StickyMSMutator
extends MSMutator

This class implements per-mutator thread behavior and state for the StickyMS plan, which implements a generational mark-sweep collector.

Specifically, this class defines MS mutator-time allocation and per-mutator thread collection semantics (flushing and restoring per-mutator allocator state).

*

See Also:
StickyMS, StickyMSCollector, MutatorContext, Phase

Field Summary
private  ObjectReferenceDeque modBuffer
          Instance fields
 
Fields inherited from class org.mmtk.plan.marksweep.MSMutator
ms
 
Fields inherited from class org.mmtk.plan.MutatorContext
immortal, lgcode, log, los, nonmove, smcode
 
Fields inherited from interface org.mmtk.utility.Constants
ALIGNMENT_VALUE, ARRAY_ELEMENT, BITS_IN_ADDRESS, BITS_IN_BYTE, BITS_IN_CHAR, BITS_IN_INT, BITS_IN_PAGE, BITS_IN_SHORT, BITS_IN_WORD, BYTES_IN_ADDRESS, BYTES_IN_BYTE, BYTES_IN_CHAR, BYTES_IN_INT, BYTES_IN_KBYTE, BYTES_IN_MBYTE, BYTES_IN_PAGE, BYTES_IN_SHORT, BYTES_IN_WORD, CARD_MASK, CARD_META_PAGES_PER_REGION, INSTANCE_FIELD, LOG_BITS_IN_ADDRESS, LOG_BITS_IN_BYTE, LOG_BITS_IN_CHAR, LOG_BITS_IN_INT, LOG_BITS_IN_PAGE, LOG_BITS_IN_SHORT, LOG_BITS_IN_WORD, LOG_BYTES_IN_ADDRESS, LOG_BYTES_IN_ADDRESS_SPACE, LOG_BYTES_IN_BYTE, LOG_BYTES_IN_CHAR, LOG_BYTES_IN_INT, LOG_BYTES_IN_KBYTE, LOG_BYTES_IN_MBYTE, LOG_BYTES_IN_PAGE, LOG_BYTES_IN_SHORT, LOG_BYTES_IN_WORD, LOG_CARD_BYTES, LOG_CARD_GRAIN, LOG_CARD_META_BYTES, LOG_CARD_META_PAGES, LOG_CARD_META_SIZE, LOG_CARD_UNITS, LOG_MIN_ALIGNMENT, MAX_ALIGNMENT, MAX_BYTES_PADDING, MAX_INT, MIN_ALIGNMENT, MIN_INT, SUPPORT_CARD_SCANNING
 
Constructor Summary
StickyMSMutator()
          Constructor
 
Method Summary
 void assertRemsetFlushed()
          Assert that the remsets have been flushed.
 void collectionPhase(short phaseId, boolean primary)
          Perform a per-mutator collection phase.
 void flush()
          Flush mutator context, in response to a requestMutatorFlush.
 void flushRememberedSets()
          Flush per-mutator remembered sets into the global remset pool.
private static StickyMS global()
           
private  void logSource(ObjectReference src)
          Add an object to the modified objects buffer and mark the object has having been logged.
 boolean objectReferenceBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes)
          A number of references are about to be copied from object src to object dst (as in an array copy).
 void objectReferenceWrite(ObjectReference src, Address slot, ObjectReference tgt, Word metaDataA, Word metaDataB, int mode)
          A new reference is about to be created.
 
Methods inherited from class org.mmtk.plan.marksweep.MSMutator
alloc, getAllocatorFromSpace, postAlloc
 
Methods inherited from class org.mmtk.plan.MutatorContext
addressBulkCopy, addressRead, addressTryCompareAndSwap, addressWrite, assertRemsetsFlushed, booleanBulkCopy, booleanRead, booleanWrite, byteBulkCopy, byteRead, byteWrite, charBulkCopy, charRead, charWrite, checkAllocator, deinitMutator, doubleBulkCopy, doubleRead, doubleWrite, extentBulkCopy, extentRead, extentWrite, floatBulkCopy, floatRead, floatWrite, getId, getLog, initMutator, intBulkCopy, intRead, intTryCompareAndSwap, intWrite, javaLangReferenceReadBarrier, longBulkCopy, longRead, longTryCompareAndSwap, longWrite, objectReferenceNonHeapRead, objectReferenceNonHeapWrite, objectReferenceRead, objectReferenceTryCompareAndSwap, offsetBulkCopy, offsetRead, offsetWrite, shortBulkCopy, shortRead, shortWrite, wordBulkCopy, wordRead, wordTryCompareAndSwap, wordWrite
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

modBuffer

private ObjectReferenceDeque modBuffer
Instance fields

Constructor Detail

StickyMSMutator

public StickyMSMutator()
Constructor

Method Detail

objectReferenceWrite

public final void objectReferenceWrite(ObjectReference src,
                                       Address slot,
                                       ObjectReference tgt,
                                       Word metaDataA,
                                       Word metaDataB,
                                       int mode)
A new reference is about to be created. Take appropriate write barrier actions.

In this case, we remember the address of the source of the pointer if the new reference points into the nursery from non-nursery space.

Overrides:
objectReferenceWrite in class MutatorContext
Parameters:
src - The object into which the new reference will be stored
slot - The address into which the new reference will be stored.
tgt - The target of the new reference
metaDataA - A value that assists the host VM in creating a store
metaDataB - A value that assists the host VM in creating a store
mode - The mode of the store (eg putfield, putstatic etc)

objectReferenceBulkCopy

public final boolean objectReferenceBulkCopy(ObjectReference src,
                                             Offset srcOffset,
                                             ObjectReference dst,
                                             Offset dstOffset,
                                             int bytes)
A number of references are about to be copied from object src to object dst (as in an array copy). Thus, dst is the mutated object. Take appropriate write barrier actions.

In this case, we remember the mutated source address range and will scan that address range at GC time.

Overrides:
objectReferenceBulkCopy in class MutatorContext
Parameters:
src - The source of the values to copied
srcOffset - The offset of the first source address, in bytes, relative to src (in principle, this could be negative).
dst - The mutated object, i.e. the destination of the copy.
dstOffset - The offset of the first destination address, in bytes relative to tgt (in principle, this could be negative).
bytes - The size of the region being copied, in bytes.
Returns:
True if the update was performed by the barrier, false if left to the caller (always false in this case).

logSource

private void logSource(ObjectReference src)
Add an object to the modified objects buffer and mark the object has having been logged. Since duplicate entries do not raise any correctness issues, we do not worry about synchronization and allow threads to race to log the object, potentially including it twice (unlike reference counting where duplicates would lead to incorrect reference counts).

Parameters:
src - The object to be logged

flushRememberedSets

public final void flushRememberedSets()
Flush per-mutator remembered sets into the global remset pool.

Overrides:
flushRememberedSets in class MutatorContext

assertRemsetFlushed

public final void assertRemsetFlushed()
Assert that the remsets have been flushed. This is critical to correctness. We need to maintain the invariant that remset entries do not accrue during GC. If the host JVM generates barrier entires it is its own responsibility to ensure that they are flushed before returning to MMTk.


collectionPhase

public final void collectionPhase(short phaseId,
                                  boolean primary)
Perform a per-mutator collection phase.

Overrides:
collectionPhase in class MSMutator
Parameters:
phaseId - The collection phase to perform
primary - Perform any single-threaded activities using this thread.

flush

public void flush()
Flush mutator context, in response to a requestMutatorFlush. Also called by the default implementation of deinitMutator.

Overrides:
flush in class MSMutator

global

private static StickyMS global()
Returns:
The active global plan as an MSGen instance.