heaphelperimpl.java

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

JAVA
308
字号
/*
 * $Id: HeapHelperImpl.java,v 1.8 2004/02/24 08:04:48 epr Exp $
 */
package org.jnode.vm;

import org.jnode.vm.classmgr.ObjectFlags;
import org.jnode.vm.classmgr.ObjectLayout;
import org.jnode.vm.classmgr.VmClassType;
import org.jnode.vm.classmgr.VmMethod;
import org.jnode.vm.memmgr.HeapHelper;

/**
 * @author Ewout Prangsma (epr@users.sourceforge.net)
 */
public final class HeapHelperImpl extends HeapHelper implements Uninterruptible {

    private final int flagsOffset;

    private final int tibOffset;

    /**
     * Initialize this instance.
     * 
     * @param arch
     */
    public HeapHelperImpl(VmArchitecture arch) {
        final int refSize = arch.getReferenceSize();
        flagsOffset = ObjectLayout.FLAGS_SLOT * refSize;
        tibOffset = ObjectLayout.TIB_SLOT * refSize;
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#addressToLong(org.jnode.vm.Address)
     */
    public final long addressToLong(Address a) {
        return Unsafe.addressToLong(a);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#allocateBlock(int)
     */
    public final Address allocateBlock(int size) {
        return MemoryBlockManager.allocateBlock(size);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#clear(org.jnode.vm.Address, int)
     */
    public final void clear(Address dst, int size) {
        Unsafe.clear(dst, size);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#copy(org.jnode.vm.Address,
     *      org.jnode.vm.Address, int)
     */
    public final void copy(Address src, Address dst, int size) {
        Unsafe.copy(src, dst, size);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#getBootHeapEnd()
     */
    public final Address getBootHeapEnd() {
        return Unsafe.getBootHeapEnd();
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#getBootHeapStart()
     */
    public final Address getBootHeapStart() {
        return Unsafe.getBootHeapStart();
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#getByte(java.lang.Object, int)
     */
    public final byte getByte(Object src, int offset) {
        return Unsafe.getByte(src, offset);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#getInt(java.lang.Object, int)
     */
    public final int getInt(Object src, int offset) {
        return Unsafe.getInt(src, offset);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#getObject(java.lang.Object, int)
     */
    public final Object getObject(Object src, int offset) {
        return Unsafe.getObject(src, offset);
    }

    /**
     * Gets the color of the given object.
     * 
     * @param src
     * @return @see org.jnode.vm.classmgr.ObjectFlags#GC_BLACK
     * @see org.jnode.vm.classmgr.ObjectFlags#GC_GREY
     * @see org.jnode.vm.classmgr.ObjectFlags#GC_WHITE
     * @see org.jnode.vm.classmgr.ObjectFlags#GC_YELLOW
     */
    public final int getObjectColor(Object src) {
        return Unsafe.getObjectFlags(src) & ObjectFlags.GC_COLOUR_MASK;
    }

    /**
     * Gets the flags of the given object.
     */
    public final int getObjectFlags(Object src) {
        return Unsafe.getObjectFlags(src);
    }

	/**
	 * Has the given object been finalized.
	 * @param src
	 * @return
	 */
	public final boolean isFinalized(Object src) {
        return ((Unsafe.getObjectFlags(src) & ObjectFlags.STATUS_FINALIZED) != 0);	    
	}
	
	/**
	 * Mark the given object as finalized.
	 * @param dst
	 */
	public final void setFinalized(Object dst) {
        final Address addr = Unsafe.add(Unsafe.addressOf(dst), flagsOffset);
        int oldValue;
        int newValue;
        do {
            oldValue = Unsafe.getInt(dst, flagsOffset);
            if ((oldValue & ObjectFlags.STATUS_FINALIZED) != 0) { return; }
            newValue = oldValue | ObjectFlags.STATUS_FINALIZED;
        } while (!Unsafe.atomicCompareAndSwap(addr, oldValue, newValue));
	}
	
    /**
     * @see org.jnode.vm.memmgr.HeapHelper#getStack(org.jnode.vm.VmThread)
     */
    public final Object getStack(VmThread thread) {
        return thread.getStack();
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#getTib(java.lang.Object)
     */
    public final Object getTib(Object object) {
        return Unsafe.getObject(object, tibOffset);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#getVmClass(java.lang.Object)
     */
    public final VmClassType getVmClass(Object object) {
        return Unsafe.getVmClass(object);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#setByte(java.lang.Object, int, byte)
     */
    public final void setByte(Object dst, int offset, byte value) {
        Unsafe.setByte(dst, offset, value);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#setInt(java.lang.Object, int, int)
     */
    public final void setInt(Object dst, int offset, int value) {
        Unsafe.setInt(dst, offset, value);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#setObject(java.lang.Object, int,
     *      java.lang.Object)
     */
    public final void setObject(Object dst, int offset, Object value) {
        Unsafe.setObject(dst, offset, value);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#unsafeSetObjectFlags(Object, int)
     */
    public final void unsafeSetObjectFlags(Object dst, int flags) {
        Unsafe.setObjectFlags(dst, flags);
    }

    /**
     * Change the color of the given object from oldColor to newColor.
     * 
     * @param dst
     * @param oldColor
     * @param newColor
     * @return True if the color was changed, false if the current color of the
     *         object was not equal to oldColor.
     */
    public boolean atomicChangeObjectColor(Object dst, int oldColor,
            int newColor) {
        final Address addr = Unsafe.add(Unsafe.addressOf(dst), flagsOffset);
        int oldValue;
        int newValue;
        do {
            oldValue = Unsafe.getInt(dst, flagsOffset);
            if ((oldValue & ObjectFlags.GC_COLOUR_MASK) != oldColor) { return false; }
            newValue = (oldValue & ~ObjectFlags.GC_COLOUR_MASK) | newColor;
        } while (!Unsafe.atomicCompareAndSwap(addr, oldValue, newValue));
        return true;
    }

    /**
     * @see org.jnode.assembler.ObjectResolver#add(org.jnode.vm.Address, int)
     */
    public final Address add(Address address, int offset) {
        return Unsafe.add(address, offset);
    }

    /**
     * @see org.jnode.assembler.ObjectResolver#addressOf(java.lang.Object)
     */
    public final Address addressOf(Object object) {
        return Unsafe.addressOf(object);
    }

    /**
     * @see org.jnode.assembler.ObjectResolver#addressOf32(java.lang.Object)
     */
    public final int addressOf32(Object object) {
        return Unsafe.addressToInt(Unsafe.addressOf(object));
    }

    /**
     * @see org.jnode.assembler.ObjectResolver#addressOf64(java.lang.Object)
     */
    public final long addressOf64(Object object) {
        return Unsafe.addressToLong(Unsafe.addressOf(object));
    }

    /**
     * @see org.jnode.assembler.ObjectResolver#addressOfArrayData(java.lang.Object)
     */
    public final Address addressOfArrayData(Object array) {
        return Address.addressOfArrayData(array);
    }

    /**
     * @see org.jnode.assembler.ObjectResolver#objectAt(org.jnode.vm.Address)
     */
    public final Object objectAt(Address ptr) {
        return Unsafe.objectAt(ptr);
    }

    /**
     * @see org.jnode.assembler.ObjectResolver#objectAt32(int)
     */
    public final Object objectAt32(int ptr) {
        return Unsafe.objectAt(Unsafe.intToAddress(ptr));
    }

    /**
     * @see org.jnode.assembler.ObjectResolver#objectAt64(long)
     */
    public final Object objectAt64(long ptr) {
        return Unsafe.objectAt(Unsafe.longToAddress(ptr));
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#invokeFinalizer(org.jnode.vm.classmgr.VmMethod,
     *      java.lang.Object)
     */
    public final void invokeFinalizer(VmMethod finalizer, Object object) {
        Unsafe.pushObject(object);
        Unsafe.invokeVoid(finalizer);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#getInflatedMonitor(java.lang.Object,
     *      org.jnode.vm.VmArchitecture)
     */
    public final Monitor getInflatedMonitor(Object object, VmArchitecture arch) {
        return MonitorManager.getInflatedMonitor(object, arch);
    }

    /**
     * @see org.jnode.vm.memmgr.HeapHelper#die(java.lang.String)
     */
    public final void die(String msg) {
        Unsafe.die(msg);
    }

    /**
     * Stop and block all threads (on all processors) on a GC safe point. Only
     * the calling thread (the GC thread) will continue.
     */
    public final void stopThreadsAtSafePoint() {
        Unsafe.getCurrentProcessor().disableReschedule();
    }

    /**
     * Unblock all threads (on all processors). This method is called after a
     * call a call to {@link #stopThreadsAtSafePoint()}.
     */
    public void restartThreads() {
        Unsafe.getCurrentProcessor().enableReschedule();
    }
}

⌨️ 快捷键说明

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