| /* |
| * 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.plan.TransitiveClosure; |
| import org.mmtk.policy.Space; |
| import org.mmtk.utility.Log; |
| import org.mmtk.vm.gcspy.ServerInterpreter; |
| import org.mmtk.vm.VM; |
| |
| import org.vmmagic.unboxed.*; |
| import org.vmmagic.pragma.*; |
| |
| /** |
| * GCspy driver for the contiguous MMTk ImmortalSpace. |
| * Adds features for the Immortal space. |
| * <p> |
| * |
| * This class extends LinearSpaceDriver, a simple driver for contiguous MMTk spaces |
| * such as CopySpace and ImmortalSpace. |
| */ |
| @Uninterruptible public class ImmortalSpaceDriver extends LinearSpaceDriver { |
| |
| private static final boolean DEBUG = false; |
| |
| // Instance variables |
| private AbstractDriver[] registeredDrivers; |
| private ImmortalSpaceDriver.Closure closure; |
| |
| /** |
| * Create a new driver for an immortal Contiguous MMTk 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 ImmortalSpaceDriver( |
| ServerInterpreter server, |
| String spaceName, |
| Space mmtkSpace, |
| int blockSize, |
| boolean mainSpace) { |
| |
| super(server, spaceName, mmtkSpace, blockSize, mainSpace); |
| |
| if (DEBUG) { |
| Log.write("ImmortalSpaceDriver 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); |
| } |
| |
| // initially no registered drivers for reference notification |
| registeredDrivers = new AbstractDriver[0]; |
| |
| closure = new ImmortalSpaceDriver.Closure(); |
| } |
| |
| /** |
| * Get the name of this driver type. |
| * @return The name, "MMTk ImmortalSpaceDriver" for this driver. |
| */ |
| protected String getDriverName() { |
| return "MMTk ImmortalSpaceDriver"; |
| } |
| |
| /** |
| * Update the tile statistics. <br> |
| * This method overrides <code> scan </code> iin its superclass to |
| * add immortal space features. |
| * |
| * @param object The current object |
| * @param total Whether to accumulate the values |
| */ |
| public void scan(ObjectReference object, boolean total) { |
| Address addr = object.toAddress(); |
| |
| if (subspace.addressInRange(addr)) { |
| VM.scanning.scanObject(closure, object); |
| super.scan(object, total); |
| } |
| } |
| |
| /** |
| * Register a set of AbstractDriver instances to be notified about direct references. |
| * |
| * @param drivers The array of driver objects. |
| */ |
| public void registerDriversForReferenceNotification(AbstractDriver[] drivers) { |
| this.registeredDrivers = drivers; |
| } |
| |
| /** |
| * Used to visit the edges in the immortal object. |
| */ |
| @Uninterruptible |
| private class Closure extends TransitiveClosure { |
| /** |
| * Process an edge. |
| */ |
| public void processEdge(ObjectReference source, Address slot) { |
| // Address in Range, locate references |
| Address target = slot.loadAddress(); |
| // notify registered drivers |
| for (int j = 0; j < registeredDrivers.length; j++) { |
| registeredDrivers[j].handleReferenceFromImmortalSpace(target); |
| } |
| } |
| } |
| } |