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
           
 
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).
 boolean objectReferenceTryCompareAndSwap(ObjectReference src, Address slot, ObjectReference old, ObjectReference tgt, Word metaDataA, Word metaDataB, int mode)
          Attempt to atomically exchange the value in the given slot with the passed replacement value.
 void objectReferenceWrite(ObjectReference src, Address slot, ObjectReference tgt, Word metaDataA, Word metaDataB, int mode)
          Write an object reference.
 
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, 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
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)
Write an object reference. Take appropriate write barrier actions.

By default do nothing, override if appropriate.

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 value 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 context in which the store occurred

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 array
srcOffset - The starting source offset
dst - The destination array
dstOffset - The starting destination offset
bytes - The number of bytes to be copied
Returns:
true if the update was performed by the barrier, false if left to the caller (always false in this case).

objectReferenceTryCompareAndSwap

public boolean objectReferenceTryCompareAndSwap(ObjectReference src,
                                                Address slot,
                                                ObjectReference old,
                                                ObjectReference tgt,
                                                Word metaDataA,
                                                Word metaDataB,
                                                int mode)
Description copied from class: MutatorContext
Attempt to atomically exchange the value in the given slot with the passed replacement value. If a new reference is created, we must then take appropriate write barrier actions.

By default do nothing, override if appropriate.

Overrides:
objectReferenceTryCompareAndSwap 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.
old - The old reference to be swapped out
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 context in which the store occurred
Returns:
True if the swap was successful.

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()
Description copied from class: MutatorContext
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. This is executed by one collector thread on behalf of a mutator thread.

Overrides:
collectionPhase in class MSMutator
Parameters:
phaseId - The unique phase identifier
primary - Should this thread be used to execute any single-threaded local operations?

flush

public void flush()
Description copied from class: MutatorContext
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.