blob: 64df4f6d8cb525ee87083a3168776210df9d4e38 [file] [log] [blame]
/*
* 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);
}
}
}
}