defaultwritebarrier.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 142 行
JAVA
142 行
/*
* $Id: DefaultWriteBarrier.java,v 1.3 2004/02/18 06:59:20 epr Exp $
*/
package org.jnode.vm.memmgr.def;
import org.jnode.vm.PragmaUninterruptible;
import org.jnode.vm.classmgr.ObjectFlags;
import org.jnode.vm.memmgr.HeapHelper;
import org.jnode.vm.memmgr.VmWriteBarrier;
/**
* @author Ewout Prangsma (epr@users.sourceforge.net)
*/
public class DefaultWriteBarrier extends VmWriteBarrier {
/** The heap helper */
private final HeapHelper helper;
/** Is the write barrier active? */
private boolean active;
/**
* Are there any object colors changed by the write barrier, since the last
* reset
*/
private boolean changed;
private int arrayCopyCount;
private int arrayStoreCount;
private int putFieldCount;
private int putStaticCount;
/**
* Initialize this instance.
*/
public DefaultWriteBarrier(HeapHelper helper) {
this.helper = helper;
}
/**
* @see org.jnode.vm.memmgr.VmWriteBarrier#arrayCopyWriteBarrier(java.lang.Object[],
* int, int)
*/
public final void arrayCopyWriteBarrier(Object array, int start, int end)
throws PragmaUninterruptible {
// The source array is already reachable, so by definition, all
// entries will be reachable.
// So we do nothing here
arrayCopyCount++;
}
/**
* @see org.jnode.vm.memmgr.VmWriteBarrier#arrayStoreWriteBarrier(java.lang.Object,
* int, java.lang.Object)
*/
public final void arrayStoreWriteBarrier(Object ref, int index, Object value)
throws PragmaUninterruptible {
if (active) {
shade(value);
}
arrayStoreCount++;
}
/**
* @see org.jnode.vm.memmgr.VmWriteBarrier#putfieldWriteBarrier(java.lang.Object,
* int, java.lang.Object)
*/
public final void putfieldWriteBarrier(Object ref, int offset, Object value)
throws PragmaUninterruptible {
if (active) {
shade(value);
}
putFieldCount++;
}
/**
* @see org.jnode.vm.memmgr.VmWriteBarrier#putstaticWriteBarrier(int,
* java.lang.Object)
*/
public final void putstaticWriteBarrier(int staticsIndex, Object value)
throws PragmaUninterruptible {
if (active) {
shade(value);
}
putStaticCount++;
}
/**
* Set the GC color of the given value to gray if it is white.
*
* @param value
*/
private final void shade(Object value) throws PragmaUninterruptible {
if (value != null) {
while (true) {
final int gcColor = helper.getObjectColor(value);
if (gcColor > ObjectFlags.GC_WHITE) {
// Not white or yellow, we're done
return; }
if (helper.atomicChangeObjectColor(value, gcColor,
ObjectFlags.GC_GREY)) {
// Change to grey, we're done
changed = true;
return;
}
}
}
}
public String toString() {
return "arrayCopy: " + arrayCopyCount + ", arrayStore: "
+ arrayStoreCount + ", putField: " + putFieldCount
+ ", putStatic: " + putStaticCount;
}
/**
* @param active
* The active to set.
*/
final void setActive(boolean active) {
this.changed = false;
this.active = active;
}
/**
* @return Returns the changed.
*/
final boolean isChanged() {
return this.changed;
}
/**
* Reset the changed attribute to false.
*/
final void resetChanged() {
this.changed = false;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?