/* * 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.vm; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.unboxed.*; @Uninterruptible public abstract class Barriers { /** * Perform the actual write of a boolean write barrier. * * @param ref The object that has the boolean field * @param value The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void booleanWrite(ObjectReference ref, boolean value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of a boolean read barrier. * * @param ref The object that has the boolean field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract boolean booleanRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of a byte write barrier. * * @param ref The object that has the byte field * @param value The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void byteWrite(ObjectReference ref, byte value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of a byte read barrier. * * @param ref The object that has the byte field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract byte byteRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of a char write barrier. * * @param ref The object that has the char field * @param value The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void charWrite(ObjectReference ref, char value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of a char read barrier. * * @param ref The object that has the char field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract char charRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of a short write barrier. * * @param ref The object that has the short field * @param value The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void shortWrite(ObjectReference ref, short value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of a short read barrier. * * @param ref The object that has the short field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract short shortRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of a int write barrier. * * @param ref The object that has the int field * @param value The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void intWrite(ObjectReference ref, int value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of a int read barrier. * * @param ref The object that has the int field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract int intRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Attempt an atomic compare and exchange in a write barrier sequence. * * @param objref The object that has the int field * @param old The old int to be swapped out * @param value the new int * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return True if the compare and swap was successful */ public abstract boolean intTryCompareAndSwap(ObjectReference objref, int old, int value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of a long write barrier. * * @param ref The object that has the long field * @param value The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void longWrite(ObjectReference ref, long value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of a long read barrier. * * @param ref The object that has the long field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract long longRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Attempt an atomic compare and exchange in a write barrier sequence. * * @param objref The object that has the long field * @param old The old long to be swapped out * @param value the new long * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return True if the compare and swap was successful */ public abstract boolean longTryCompareAndSwap(ObjectReference objref, long old, long value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of a float write barrier. * * @param ref The object that has the float field * @param value The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void floatWrite(ObjectReference ref, float value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of a float read barrier. * * @param ref The object that has the float field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract float floatRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of a double write barrier. * * @param ref The object that has the double field * @param value The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void doubleWrite(ObjectReference ref, double value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of a double read barrier. * * @param ref The object that has the double field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract double doubleRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of an object reference write barrier. * * @param ref The object that has the reference field * @param value The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void objectReferenceWrite(ObjectReference ref, ObjectReference value, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of a read barrier. * * @param ref The object that has the reference field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract ObjectReference objectReferenceRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of the non-heap write barrier. This is * used when the store is not to an object, but to a non-heap location * such as statics or the stack. * * @param slot The address that contains the reference field * @param target The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot */ public abstract void objectReferenceNonHeapWrite(Address slot, ObjectReference target, Word metaDataA, Word metaDataB); /** * Atomically write a reference field of an object or array and return * the old value of the reference field. * * @param ref The object that has the reference field * @param target The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return The value that was replaced by the write. */ public abstract ObjectReference objectReferenceAtomicWrite(ObjectReference ref, ObjectReference target, Word metaDataA, Word metaDataB, int mode); /** * Attempt an atomic compare and exchange in a write barrier sequence. * * @param ref The object that has the reference field * @param old The old reference to be swapped out * @param target The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return True if the compare and swap was successful */ public abstract boolean objectReferenceTryCompareAndSwap(ObjectReference ref, ObjectReference old, ObjectReference target, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of the write barrier, writing the value as a raw Word. * * @param ref The object that has the Word field * @param target The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void wordWrite(ObjectReference ref, Word target, Word metaDataA, Word metaDataB, int mode); /** * Atomically write a Word field of an object or array and return * the old value of the Word field. * * @param ref The object that has the Word field * @param target The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return The raw value that was replaced by the write. */ public abstract Word wordAtomicWrite(ObjectReference ref, Word rawTarget, Word metaDataA, Word metaDataB, int mode); /** * Attempt an atomic compare and exchange in a write barrier sequence. * * @param ref The object that has the Word field * @param old The old Word to be swapped out * @param target The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return True if the compare and swap was successful */ public abstract boolean wordTryCompareAndSwap(ObjectReference ref, Word old, Word target, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of the read barrier, returning the value as a raw Word. * * @param ref The object that has the Word field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract Word wordRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of the write barrier, writing the value as a raw Address. * * @param ref The object that has the Address field * @param target The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void addressWrite(ObjectReference ref, Address target, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of the read barrier, returning the value as a raw Address. * * @param ref The object that has the Address field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract Address addressRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Attempt an atomic compare and exchange in a write barrier sequence. * * @param ref The object that has the Address field * @param old The old address to be swapped out * @param target The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return True if the compare and swap was successful */ public abstract boolean addressTryCompareAndSwap(ObjectReference ref, Address old, Address target, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of the write barrier, writing the value as a raw Offset. * * @param ref The object that has the Offset field * @param target The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void offsetWrite(ObjectReference ref, Offset target, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of the read barrier, returning the value as a raw Offset. * * @param ref The object that has the Offset field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract Offset offsetRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual write of the write barrier, writing the value as a raw Extent. * * @param ref The object that has the Extent field * @param target The value that the slot will be updated to * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring */ public abstract void extentWrite(ObjectReference ref, Extent target, Word metaDataA, Word metaDataB, int mode); /** * Perform the actual read of the read barrier, returning the value as a raw Extent. * * @param ref The object that has the Extent field * @param metaDataA Opaque, VM-specific, meta-data identifying the slot * @param metaDataB Opaque, VM-specific, meta-data identifying the slot * @param mode The context in which the write is occurring * @return the read value */ public abstract Extent extentRead(ObjectReference ref, Word metaDataA, Word metaDataB, int mode); /** * Sets an element of an object array without invoking any write * barrier. This method is called by the Map class to ensure * potentially-allocation-triggering write barriers do not occur in * allocation slow path code. * * @param dst the destination array * @param index the index of the element to set * @param value the new value for the element */ public abstract void objectArrayStoreNoGCBarrier(Object [] dst, int index, Object value); }