public abstract class AbstractDriver extends Object
This class implements for the MMTk a base driver for a GCspy space. All drivers for GCspy spaces should inherit from this class.
| Modifier and Type | Field and Description |
|---|---|
protected int |
blockSize
The GCspy space's block size
|
protected boolean |
changed
Has this space changed?
|
protected byte[] |
control
control values for tiles in this space
|
protected static byte |
CONTROL_BACKGROUND
The tile is a background tile
|
protected static byte |
CONTROL_LINK
The tile is a link
|
protected static byte |
CONTROL_SEPARATOR
The tile is a separator
|
protected static byte |
CONTROL_UNUSED
The tile is unused
|
protected static byte |
CONTROL_USED
The tile is used
|
private static boolean |
DEBUG |
private static int |
MAX_STREAMS |
protected int |
maxTileNum
The maximum number of tiles in this GCspy space
|
protected Space |
mmtkSpace
The MMTK space
|
protected String |
myClass |
protected String |
name
The name of the GCspy space driver
|
protected ServerInterpreter |
server
The owning GCspy server
|
protected ServerSpace |
serverSpace
The GCspy space abstraction
|
protected Stream[] |
streams
This space's streams
|
| Constructor and Description |
|---|
AbstractDriver(ServerInterpreter server,
String name,
Space mmtkSpace,
int blockSize,
boolean mainSpace)
Create a new driver for this collector.
|
| Modifier and Type | Method and Description |
|---|---|
protected void |
addControl(int index,
byte value)
Add a control to the tile
|
void |
addStream(Stream stream)
Add a stream to the driver.
|
protected static boolean |
controlIsBackground(byte val)
Is a tile a background pseudo-tile?
|
protected static boolean |
controlIsSeparator(byte val)
Is this a separator?
|
protected static boolean |
controlIsUnused(byte val)
Is a tile unused?
|
protected static boolean |
controlIsUsed(byte val)
Is a tile used?
|
protected void |
controlValues(byte tag,
int start,
int len)
Set the control value in each tile in a region.
|
protected int |
countTileNum(Address start,
Address end,
int tileSize)
Count number of tiles in an address range.
|
protected int |
countTileNum(Extent extent,
int tileSize)
Count number of tiles in an address range.
|
private int |
countTileNum(int diff,
int tileSize) |
protected ServerSpace |
createServerSpace(ServerInterpreter server,
String spaceName,
int maxTileNum,
boolean mainSpace)
Create a new GCspy ServerSpace and add it to the ServerInterpreter.
|
protected Subspace |
createSubspace(Space mmtkSpace)
Creates a subspace for this space.
|
byte |
getControl(int index)
Get the controls for a tile.
|
protected abstract String |
getDriverName()
Get the name of this driver type.
|
int |
getMaxTileNum()
Get the maximum number of tiles in this space.
|
ServerSpace |
getServerSpace()
The GCspy space managed by this driver.
|
boolean |
handleReferenceFromImmortalSpace(Address addr)
Handle a direct reference from the immortal space.
|
protected void |
initControl(int index,
byte value)
Initialise the value of a control.
|
protected void |
initControls()
Initialise control values in all tiles
|
boolean |
isConnected(int event) |
int |
maxObjectsPerBlock(int blockSize)
The "typical" maximum number of objects in each tile.
|
protected void |
resetData()
Reset the statistics for a space.
|
void |
scan(Address obj)
Scan an object found at a location.
|
void |
scan(Address obj,
boolean total)
Scan an object found at a location.
|
void |
scan(ObjectReference obj)
Scan an object found at a location.
|
void |
scan(ObjectReference obj,
boolean total)
Scan an object found at a location.
|
protected void |
send(int event,
int numTiles)
Send all the streams for this space if it has changed.
|
protected void |
setControl(int index,
byte value)
Set the control
|
void |
setRange(Address start,
Address end)
Indicate the limits of a space.
|
void |
setRange(Address start,
Extent extent)
Indicate the limits of a space.
|
protected void |
setSpaceInfo(Offset size)
Set space info.
|
protected void |
setTilenames(Subspace subspace,
int numTiles)
Setup the tile names in a subspace.
|
abstract void |
transmit(int event)
Transmit the streams for this space.
|
protected static final byte CONTROL_USED
protected static final byte CONTROL_BACKGROUND
protected static final byte CONTROL_UNUSED
protected static final byte CONTROL_SEPARATOR
protected static final byte CONTROL_LINK
private static final int MAX_STREAMS
private static final boolean DEBUG
protected final ServerInterpreter server
protected final ServerSpace serverSpace
protected int blockSize
protected int maxTileNum
protected byte[] control
protected boolean changed
public AbstractDriver(ServerInterpreter server, String name, Space mmtkSpace, int blockSize, boolean mainSpace)
server - The ServerInterpreter that owns this GCspy space.name - The name of this driver.mmtkSpace - The MMTk space represented by this driver.blockSize - The tile size.mainSpace - Is this the main space?protected Subspace createSubspace(Space mmtkSpace)
mmtkSpace - The MMTk spaceprotected ServerSpace createServerSpace(ServerInterpreter server, String spaceName, int maxTileNum, boolean mainSpace)
server - the GCspy ServerInterpreter.spaceName - The name of this driver.maxTileNum - the maximum number of tiles in this space.mainSpace - Is this the main space?protected abstract String getDriverName()
public int getMaxTileNum()
public ServerSpace getServerSpace()
public void addStream(Stream stream)
stream - The streamIndexOutOfBoundsException - if more than MAX_STREAMS are addedprotected int countTileNum(Address start, Address end, int tileSize)
start - The start of the range.end - The end of the range.tileSize - The size of each tile.protected int countTileNum(Extent extent, int tileSize)
extent - The extent of the range.tileSize - The size of each tile.private int countTileNum(int diff, int tileSize)
public void setRange(Address start, Address end)
start - the Address of the start of the space.end - the Address of the end of the space.public void setRange(Address start, Extent extent)
start - the Address of the start of the space.extent - the extent of the space.protected void setTilenames(Subspace subspace, int numTiles)
subspace - the SubspacenumTiles - the number of tiles to namepublic int maxObjectsPerBlock(int blockSize)
blockSize - The size of a tilepublic boolean isConnected(int event)
event - The current eventprotected void resetData()
public void scan(ObjectReference obj, boolean total)
obj - the reference to the object foundtotal - Whether to total the statisticspublic void scan(ObjectReference obj)
obj - the reference to the object foundpublic void scan(Address obj, boolean total)
obj - the reference to the object foundtotal - Whether to total the statisticspublic void scan(Address obj)
obj - the reference to the object foundpublic boolean handleReferenceFromImmortalSpace(Address addr)
This is an empty implementation. Subclasses may override this method
to increment their refFromImmortal Stream.
addr - The Addresstrue if the given Address is in this subspace. Always false here.protected void setSpaceInfo(Offset size)
size - the size of the spaceprotected static boolean controlIsUsed(byte val)
val - the control value.true if the tile is usedprotected static boolean controlIsBackground(byte val)
val - the control value.true if the tile is a background tileprotected static boolean controlIsUnused(byte val)
val - the control value.true if the tile is unusedprotected static boolean controlIsSeparator(byte val)
val - the control value.true if this is a separatorprotected void initControl(int index, byte value)
index - The index of the tile.value - The new value of the controlprotected void addControl(int index, byte value)
index - The index of the tile.value - The control to add.protected void setControl(int index, byte value)
index - the index of the tilevalue - The value to setpublic byte getControl(int index)
index - The index of the tile.protected void initControls()
protected void controlValues(byte tag, int start, int len)
tag - The control tag.start - The start index of the region.len - The number of tiles in the region.public abstract void transmit(int event)
server.isConnected(event)
stream.setSummary(values...);
controlValues(CONTROL_USED, start, numBlocks);
controlValues(CONTROL_UNUSED, end, remainingBlocks);
setSpace(info);
send(event, numTiles);Note that AbstractDriver.send takes care of sending the information for all streams (including control data).
event - The eventprotected void send(int event, int numTiles)
event - the eventnumTiles - the number of blocks in this space