| /* |
| * 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; |
| } |
| |
| } |