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