blob: 125c8dac6e84709b1b7d3a85817ba82de38f9b9e [file] [log] [blame]
/*
* 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);
}