/* * 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 static org.mmtk.utility.gcspy.StreamConstants.PAINT_STYLE_ZERO; import static org.mmtk.utility.gcspy.StreamConstants.PRESENTATION_PLUS; import org.mmtk.policy.Space; import org.mmtk.utility.Log; import org.mmtk.utility.gcspy.Color; import org.mmtk.vm.VM; import org.mmtk.vm.gcspy.ServerInterpreter; import org.mmtk.vm.gcspy.ShortStream; import org.vmmagic.pragma.Interruptible; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.unboxed.Address; /** * 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=", blockSize); Log.write(", start=", mmtkSpace.getStart()); Log.write(", extent=", mmtkSpace.getExtent()); Log.writeln(", maxTileNum=", maxTileNum); } resetData(); } /** * Get the name of this driver type. * @return The name, "MMTk GenImmortalSpaceDriver" for this driver. */ @Override protected String getDriverName() { return "MMTk GenImmortalSpaceDriver"; } /* * Helper 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", PRESENTATION_PLUS, 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. */ @Override protected void setupSummaries() { super.setupSummaries(); remsetStream.setSummary(totalRemset); } /** * Handle a remset address * * @param addr Remset Address * @return {@code 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; } }