/* * 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.utility.gcspy.Color; import org.mmtk.utility.gcspy.StreamConstants; import org.mmtk.vm.VM; import org.mmtk.vm.gcspy.ShortStream; import org.mmtk.vm.gcspy.ServerInterpreter; import org.mmtk.policy.LargeObjectSpace; import org.vmmagic.unboxed.*; import org.vmmagic.pragma.*; /** * This class extends a simple driver for the MMTk LargeObjectSpace * for Generational Collectors. */ @Uninterruptible public class GenLOSDriver extends TreadmillDriver { private static final boolean DEBUG = false; // The additional remset stream protected ShortStream remsetStream; // Additional overall statistic protected int totalRemset = 0; // total of remset Addresses /** * Create a new driver for this collector * * @param server The name of the GCspy server that owns this space * @param spaceName The name of this driver * @param lospace the large object space for this allocator * @param blockSize The tile size * @param threshold the size threshold of the LOS * @param mainSpace Is this the main space? */ public GenLOSDriver(ServerInterpreter server, String spaceName, LargeObjectSpace lospace, int blockSize, int threshold, boolean mainSpace) { //TODO blocksize should be a multiple of treadmill granularity super(server, spaceName, lospace, blockSize, threshold, mainSpace); // create remset stream remsetStream = createRemsetStream(); // Initialise the statistics resetData(); } /** * Get the name of this driver type. * @return The name, "MMTk GenLOSDriver" for this driver. */ protected String getDriverName() { return "MMTk GenLOSDriver"; } // private creator methods for the 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 <code>transmitSetupSummaries </code> of superclass to * handle additional streams. */ 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 this.totalRemset++; return true; } else { return false; } } /** * Reset the remset Stream. <p> * The remset Stream has to be reset seperately because we do not * gather data in the usual way using <code>scan()</code>. */ public void resetRemsetStream() { remsetStream.resetData(); totalRemset = 0; } }