blob: cb847809cde8dd365e3a5ad96fbebe24119f0ab6 [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.plan.semispace.usePrimitiveWriteBarriers;
import org.mmtk.plan.semispace.SSMutator;
import org.mmtk.vm.VM;
import org.vmmagic.unboxed.*;
import org.vmmagic.pragma.*;
/**
* This class extends the {@link SSMutator} class as part of the
* {@link UsePrimitiveWriteBarriers} collector. It overrides various methods in
* {@link Mutator} to implement primitive write barriers.
*/
@Uninterruptible
public class UsePrimitiveWriteBarriersMutator extends SSMutator {
/**
* Write an Address. Take appropriate write barrier actions.<p>
*
* @param src The object into which the Word will be stored
* @param slot The address into which the Word will be
* stored.
* @param value The value of the new Address
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void addressWrite(ObjectReference src, Address slot, Address value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.addressWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* Attempt to atomically exchange the value in the given slot
* with the passed replacement value.
*
* @param src The object into which the Address will be stored
* @param slot The address into which the Address will be
* stored.
* @param old The old Address to be swapped out
* @param value The new Address
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
* @return True if the swap was successful.
*/
public boolean addressTryCompareAndSwap(ObjectReference src, Address slot, Address old, Address value, Word metaDataA, Word metaDataB, int mode) {
return VM.barriers.addressTryCompareAndSwap(src, old, value, metaDataA, metaDataB, mode);
}
/**
* Write a boolean. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new boolean
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void booleanWrite(ObjectReference src, Address slot, boolean value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.booleanWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* A number of booleans are about to be copied from object
* <code>src</code> to object <code>dst</code> (as in an array
* copy). Thus, <code>dst</code> is the mutated object. Take
* appropriate write barrier actions.<p>
*
* @param src The source array
* @param srcOffset The starting source offset
* @param dst The destination array
* @param dstOffset The starting destination offset
* @param bytes The number of bytes to be copied
* @return True if the update was performed by the barrier, false if
* left to the caller
*/
public boolean booleanBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
return false;
}
/**
* Write a byte. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new byte
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void byteWrite(ObjectReference src, Address slot, byte value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.byteWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* A number of bytes are about to be copied from object
* <code>src</code> to object <code>dst</code> (as in an array
* copy). Thus, <code>dst</code> is the mutated object. Take
* appropriate write barrier actions.<p>
*
* @param src The source array
* @param srcOffset The starting source offset
* @param dst The destination array
* @param dstOffset The starting destination offset
* @param bytes The number of bytes to be copied
* @return True if the update was performed by the barrier, false if
* left to the caller
*/
public boolean byteBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
return false;
}
/**
* Write a char. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new char
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void charWrite(ObjectReference src, Address slot, char value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.charWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* A number of chars are about to be copied from object
* <code>src</code> to object <code>dst</code> (as in an array
* copy). Thus, <code>dst</code> is the mutated object. Take
* appropriate write barrier actions.<p>
*
* @param src The source array
* @param srcOffset The starting source offset
* @param dst The destination array
* @param dstOffset The starting destination offset
* @param bytes The number of bytes to be copied
* @return True if the update was performed by the barrier, false if
* left to the caller
*/
public boolean charBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
return false;
}
/**
* Write a double. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new double
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void doubleWrite(ObjectReference src, Address slot, double value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.doubleWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* A number of doubles are about to be copied from object
* <code>src</code> to object <code>dst</code> (as in an array
* copy). Thus, <code>dst</code> is the mutated object. Take
* appropriate write barrier actions.<p>
*
* @param src The source array
* @param srcOffset The starting source offset
* @param dst The destination array
* @param dstOffset The starting destination offset
* @param bytes The number of bytes to be copied
* @return True if the update was performed by the barrier, false if
* left to the caller
*/
public boolean doubleBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
return false;
}
/**
* Write an Extent. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new Extent
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void extentWrite(ObjectReference src, Address slot, Extent value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.extentWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* Write a float. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new float
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void floatWrite(ObjectReference src, Address slot, float value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.floatWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* A number of floats are about to be copied from object
* <code>src</code> to object <code>dst</code> (as in an array
* copy). Thus, <code>dst</code> is the mutated object. Take
* appropriate write barrier actions.<p>
*
* @param src The source array
* @param srcOffset The starting source offset
* @param dst The destination array
* @param dstOffset The starting destination offset
* @param bytes The number of bytes to be copied
* @return True if the update was performed by the barrier, false if
* left to the caller
*/
public boolean floatBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
return false;
}
/**
* Write a int. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new int
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void intWrite(ObjectReference src, Address slot, int value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.intWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* A number of ints are about to be copied from object
* <code>src</code> to object <code>dst</code> (as in an array
* copy). Thus, <code>dst</code> is the mutated object. Take
* appropriate write barrier actions.<p>
*
* @param src The source array
* @param srcOffset The starting source offset
* @param dst The destination array
* @param dstOffset The starting destination offset
* @param bytes The number of bytes to be copied
* @return True if the update was performed by the barrier, false if
* left to the caller
*/
public boolean intBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
return false;
}
/**
* Attempt to atomically exchange the value in the given slot
* with the passed replacement value.
*
* @param src The object into which the value will be stored
* @param slot The address into which the value will be
* stored.
* @param old The old int to be swapped out
* @param value The new int
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
* @return True if the swap was successful.
*/
public boolean intTryCompareAndSwap(ObjectReference src, Address slot, int old, int value, Word metaDataA, Word metaDataB, int mode) {
return VM.barriers.intTryCompareAndSwap(src, old, value, metaDataA, metaDataB, mode);
}
/**
* Write a long. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new long
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void longWrite(ObjectReference src, Address slot, long value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.longWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* A number of longs are about to be copied from object
* <code>src</code> to object <code>dst</code> (as in an array
* copy). Thus, <code>dst</code> is the mutated object. Take
* appropriate write barrier actions.<p>
*
* @param src The source array
* @param srcOffset The starting source offset
* @param dst The destination array
* @param dstOffset The starting destination offset
* @param bytes The number of bytes to be copied
* @return True if the update was performed by the barrier, false if
* left to the caller
*/
public boolean longBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
return false;
}
/**
* Attempt to atomically exchange the value in the given slot
* with the passed replacement value.
*
* @param src The object into which the value will be stored
* @param slot The address into which the value will be
* stored.
* @param old The old long to be swapped out
* @param value The new long
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
* @return True if the swap was successful.
*/
public boolean longTryCompareAndSwap(ObjectReference src, Address slot, long old, long value, Word metaDataA, Word metaDataB, int mode) {
return VM.barriers.longTryCompareAndSwap(src, old, value, metaDataA, metaDataB, mode);
}
/**
* Write an Offset. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new Offset
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void offsetWrite(ObjectReference src, Address slot, Offset value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.offsetWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* Write a short. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new short
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void shortWrite(ObjectReference src, Address slot, short value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.shortWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* A number of shorts are about to be copied from object
* <code>src</code> to object <code>dst</code> (as in an array
* copy). Thus, <code>dst</code> is the mutated object. Take
* appropriate write barrier actions.<p>
*
* @param src The source array
* @param srcOffset The starting source offset
* @param dst The destination array
* @param dstOffset The starting destination offset
* @param bytes The number of bytes to be copied
* @return True if the update was performed by the barrier, false if
* left to the caller
*/
public boolean shortBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
return false;
}
/**
* Write a Word. Take appropriate write barrier actions.<p>
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param value The value of the new Word
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
*/
public void wordWrite(ObjectReference src, Address slot, Word value, Word metaDataA, Word metaDataB, int mode) {
VM.barriers.wordWrite(src, value, metaDataA, metaDataB, mode);
}
/**
* Attempt to atomically exchange the value in the given slot
* with the passed replacement value.
*
* @param src The object into which the new reference will be stored
* @param slot The address into which the new reference will be
* stored.
* @param old The old Word to be swapped out
* @param value The new Word
* @param metaDataA A value that assists the host VM in creating a store
* @param metaDataB A value that assists the host VM in creating a store
* @param mode The context in which the store occurred
* @return True if the swap was successful.
*/
public boolean wordTryCompareAndSwap(ObjectReference src, Address slot, Word old, Word value, Word metaDataA, Word metaDataB, int mode) {
return VM.barriers.wordTryCompareAndSwap(src, old, value, metaDataA, metaDataB, mode);
}
}