org.mmtk.plan.refcount
Class RCBaseMutator

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.refcount.RCBaseMutator
All Implemented Interfaces:
Constants
Direct Known Subclasses:
GenRCMutator, RCMutator

public class RCBaseMutator
extends StopTheWorldMutator

This class implements the mutator context for a simple reference counting collector.


Field Summary
private  BTSweepImmortalScanner btSweepImmortal
           
private  RCDecBuffer decBuffer
           
private  ObjectReferenceDeque modBuffer
           
private  ExplicitFreeListLocal rc
          Instance fields
private  LargeObjectLocal rclos
           
 
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
RCBaseMutator()
          Constructor.
 
Method Summary
 Address alloc(int bytes, int align, int offset, int allocator, int site)
          Allocate memory for an object.
 void assertRemsetsFlushed()
          Assert that the remsets have been flushed.
private  void coalescingWriteBarrierSlow(ObjectReference srcObj)
          Slow path of the coalescing write barrier.
 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.
 Allocator getAllocatorFromSpace(Space space)
          Return the allocator instance associated with a space space, for this plan instance.
private static RCBase global()
           
 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)
          A new reference is about to be created.
 void postAlloc(ObjectReference ref, ObjectReference typeRef, int bytes, int allocator)
          Perform post-allocation actions.
 
Methods inherited from class org.mmtk.plan.MutatorContext
addressBulkCopy, addressRead, addressTryCompareAndSwap, addressWrite, 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

rc

private final ExplicitFreeListLocal rc
Instance fields


rclos

private final LargeObjectLocal rclos

modBuffer

private final ObjectReferenceDeque modBuffer

decBuffer

private final RCDecBuffer decBuffer

btSweepImmortal

private final BTSweepImmortalScanner btSweepImmortal
Constructor Detail

RCBaseMutator

public RCBaseMutator()
Constructor. One instance is created per physical processor.

Method Detail

alloc

public Address alloc(int bytes,
                     int align,
                     int offset,
                     int allocator,
                     int site)
Allocate memory for an object.

Overrides:
alloc in class MutatorContext
Parameters:
bytes - The number of bytes required for the object.
align - Required alignment for the object.
offset - Offset associated with the alignment.
allocator - The allocator associated with this request.
site - Allocation site
Returns:
The address of the newly allocated memory.

postAlloc

public void postAlloc(ObjectReference ref,
                      ObjectReference typeRef,
                      int bytes,
                      int allocator)
Perform post-allocation actions. For many allocators none are required.

Overrides:
postAlloc in class MutatorContext
Parameters:
ref - The newly allocated object
typeRef - the type reference for the instance being created
bytes - The size of the space to be allocated (in bytes)
allocator - The allocator number to be used for this allocation

getAllocatorFromSpace

public Allocator getAllocatorFromSpace(Space space)
Return the allocator instance associated with a space space, for this plan instance.

Overrides:
getAllocatorFromSpace in class MutatorContext
Parameters:
space - The space for which the allocator instance is desired.
Returns:
The allocator instance associated with this plan instance which is allocating into space, or null if no appropriate allocator can be established.

collectionPhase

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

Overrides:
collectionPhase in class SimpleMutator
Parameters:
phaseId - The collection phase to perform
primary - perform any single-threaded local activities.

flushRememberedSets

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

Overrides:
flushRememberedSets in class MutatorContext

assertRemsetsFlushed

public final void assertRemsetsFlushed()
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.

Overrides:
assertRemsetsFlushed in class MutatorContext

flush

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

Overrides:
flush in class MutatorContext

objectReferenceWrite

public 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.

By default do nothing, override if appropriate.

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

objectReferenceTryCompareAndSwap

public 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. 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 occured
Returns:
True if the swap was successful.

objectReferenceBulkCopy

public 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.

Overrides:
objectReferenceBulkCopy in class MutatorContext
Parameters:
src - The source of the values to be 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).

coalescingWriteBarrierSlow

private void coalescingWriteBarrierSlow(ObjectReference srcObj)
Slow path of the coalescing write barrier.

Attempt to log the source object. If successful in racing for the log bit, push an entry into the modified buffer and add a decrement buffer entry for each referent object (in the RC space) before setting the header bit to indicate that it has finished logging (allowing others in the race to continue).

Parameters:
srcObj - The object being mutated

global

private static RCBase global()
Returns:
The active global plan as an RC instance.