org.mmtk.plan.stickyimmix
Class StickyImmixMutator

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.immix.ImmixMutator
                  extended by org.mmtk.plan.stickyimmix.StickyImmixMutator
All Implemented Interfaces:
Constants

public class StickyImmixMutator
extends ImmixMutator

This class implements per-mutator thread behavior and state for the StickyImmix 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:
StickyImmix, StickyImmixCollector, MutatorContext, Phase

Field Summary
private  ObjectReferenceDeque modBuffer
           
 
Fields inherited from class org.mmtk.plan.immix.ImmixMutator
immix
 
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
StickyImmixMutator()
          Constructor
 
Method Summary
 void assertRemsetFlushed()
           
 void collectionPhase(short phaseId, boolean primary)
          Perform a per-mutator collection phase.
 void flushRememberedSets()
          Flush per-mutator remembered sets into the global remset pool.
private static StickyImmix 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.immix.ImmixMutator
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, flush, 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

StickyImmixMutator

public StickyImmixMutator()
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 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).

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()

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 ImmixMutator
Parameters:
phaseId - The unique phase identifier
primary - Should this thread be used to execute any single-threaded local operations?

global

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