gcsweepvisitor.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 72 行

JAVA
72
字号
/*
 * $Id: GCSweepVisitor.java,v 1.1 2004/02/18 06:59:19 epr Exp $
 */
package org.jnode.vm.memmgr.def;

import org.jnode.vm.ObjectVisitor;
import org.jnode.vm.Uninterruptible;
import org.jnode.vm.classmgr.ObjectFlags;
import org.jnode.vm.classmgr.VmClassType;
import org.jnode.vm.memmgr.HeapHelper;

/**
 * @author Ewout Prangsma (epr@users.sourceforge.net)
 */
final class GCSweepVisitor extends ObjectVisitor implements ObjectFlags,
        Uninterruptible {

    private final HeapHelper helper;

    /** The heap that is currently being visited */
    private VmAbstractHeap currentHeap;

    public GCSweepVisitor(DefaultHeapManager heapMgr) {
        this.helper = heapMgr.getHelper();
    }

    /**
     * Mark every visited object white.
     * 
     * @param object
     * @return boolean
     */
    public final boolean visit(Object object) {
        final int gcColor = helper.getObjectColor(object);

        if (gcColor == GC_WHITE) {
            final boolean finalized = helper.isFinalized(object);
            if (finalized) {
                // Already finalized, we can free it now
                currentHeap.free(object);
            } else {
                final VmClassType vmClass = helper.getVmClass(object);
                if (!vmClass.hasFinalizer()) {
                    // No finalizer, we can free it now
                    currentHeap.free(object);
                } else {
                    // Mark object for invoke of finalizer on other thread.
                    helper.atomicChangeObjectColor(object, gcColor, GC_YELLOW);
                }
            }
        } else {
            helper.atomicChangeObjectColor(object, gcColor, GC_WHITE);
        }
        return true;
    }

    /**
     * @return Returns the currentHeap.
     */
    public final VmAbstractHeap getCurrentHeap() {
        return this.currentHeap;
    }

    /**
     * @param currentHeap
     *            The currentHeap to set.
     */
    public final void setCurrentHeap(VmAbstractHeap currentHeap) {
        this.currentHeap = currentHeap;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?