blob: 8a4761fcd1218766b421f55cb369767f97b7d442 [file] [log] [blame]
/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* 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/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.mmtk.utility.gcspy.drivers;
import org.mmtk.policy.Space;
import org.mmtk.utility.gcspy.Color;
import org.mmtk.utility.gcspy.StreamConstants;
import org.mmtk.vm.VM;
import org.mmtk.vm.gcspy.ShortStream;
import org.mmtk.utility.Log;
import org.mmtk.vm.gcspy.ServerInterpreter;
import org.vmmagic.unboxed.*;
import org.vmmagic.pragma.*;
/**
* GCspy driver for the MMTk generational immortal space.
* Additional Stream for remset references.
* This class extends ImmortalSpaceDriver, a simple driver for
* the contiguous MMTk ImmortalSpace.
*/
@Uninterruptible public class GenImmortalSpaceDriver extends ImmortalSpaceDriver {
private static final boolean DEBUG = false;
// The Stream for newly promoted objects
protected ShortStream remsetStream;
// Statistics for remset references
protected int totalRemset = 0;
/**
* Create a new driver for a generational immortal space.
*
* @param server The GCspy ServerInterpreter
* @param spaceName The name of this GCspy space
* @param mmtkSpace The MMTk space
* @param blockSize The tile size
* @param mainSpace Is this the main space?
*/
public GenImmortalSpaceDriver(
ServerInterpreter server,
String spaceName,
Space mmtkSpace,
int blockSize,
boolean mainSpace) {
super(server, spaceName, mmtkSpace, blockSize, mainSpace);
// create additional stream
remsetStream = createRemsetStream();
if (DEBUG) {
Log.write("GenImmortalSpaceDriver for "); Log.write(spaceName);
Log.write(", blocksize="); Log.write(blockSize);
Log.write(", start="); Log.write(mmtkSpace.getStart());
Log.write(", extent="); Log.write(mmtkSpace.getExtent());
Log.write(", maxTileNum="); Log.writeln(maxTileNum);
}
resetData();
}
/**
* Get the name of this driver type.
* @return The name, "MMTk GenImmortalSpaceDriver" for this driver.
*/
protected String getDriverName() {
return "MMTk GenImmortalSpaceDriver";
}
/**
* Heelper methods to create the additional streams
*/
@Interruptible
private ShortStream createRemsetStream() {
return VM.newGCspyShortStream(
this,
"Remembered set stream",
(short)0,
// Say, typical size = 4 * typical scalar size?
(short)(maxObjectsPerBlock(blockSize)/8),
(short)0,
(short)0,
"Remset references: ",
" references",
StreamConstants.PRESENTATION_PLUS,
StreamConstants.PAINT_STYLE_ZERO,
0,
Color.Cyan,
true);
}
/**
* Setup summaries part of the <code>transmit</code> method.<p>
* Overrides method in superclass to handle additional Stream.
*/
protected void setupSummaries() {
super.setupSummaries();
remsetStream.setSummary(totalRemset);
}
/**
* Handle a remset address
*
* @param addr Remset Address
* @return true if the given Address is in this subspace.
*/
public boolean handleRemsetAddress(Address addr) {
if(subspace.addressInRange(addr)) {
// increment tile
int index = subspace.getIndex(addr);
remsetStream.increment(index, (short)1);
// increment summary
totalRemset++;
return true;
} else {
return false;
}
}
/**
* Reset the remset Stream
* The remset Stream has to be reset seperately because we do not
* gather data in the usual way using scan().
*/
public void resetRemsetStream() {
remsetStream.resetData();
totalRemset = 0;
}
}