001 /*
002 * This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 * This file is licensed to You under the Eclipse Public License (EPL);
005 * You may not use this file except in compliance with the License. You
006 * may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 * See the COPYRIGHT.txt file distributed with this work for information
011 * regarding copyright ownership.
012 */
013 package org.mmtk.plan.semispace.usePrimitiveWriteBarriers;
014
015 import org.mmtk.plan.semispace.SSMutator;
016 import org.mmtk.vm.VM;
017
018 import org.vmmagic.unboxed.*;
019 import org.vmmagic.pragma.*;
020
021 /**
022 * This class extends the {@link SSMutator} class as part of the
023 * {@link UsePrimitiveWriteBarriers} collector. It overrides various methods in
024 * {@link SSMutator} to implement primitive write barriers.
025 */
026 @Uninterruptible
027 public class UsePrimitiveWriteBarriersMutator extends SSMutator {
028
029 /**
030 * Write an Address. Take appropriate write barrier actions.<p>
031 */
032 @Override
033 public void addressWrite(ObjectReference src, Address slot, Address value, Word metaDataA, Word metaDataB, int mode) {
034 VM.barriers.addressWrite(src, value, metaDataA, metaDataB, mode);
035 }
036
037 /**
038 * Attempt to atomically exchange the value in the given slot
039 * with the passed replacement value.
040 */
041 @Override
042 public boolean addressTryCompareAndSwap(ObjectReference src, Address slot, Address old, Address value, Word metaDataA, Word metaDataB, int mode) {
043 return VM.barriers.addressTryCompareAndSwap(src, old, value, metaDataA, metaDataB, mode);
044 }
045
046 /**
047 * Write a boolean. Take appropriate write barrier actions.<p>
048 */
049 @Override
050 public void booleanWrite(ObjectReference src, Address slot, boolean value, Word metaDataA, Word metaDataB, int mode) {
051 VM.barriers.booleanWrite(src, value, metaDataA, metaDataB, mode);
052 }
053
054 @Override
055 public boolean booleanBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
056 return false;
057 }
058
059 /**
060 * Write a byte. Take appropriate write barrier actions.<p>
061 */
062 @Override
063 public void byteWrite(ObjectReference src, Address slot, byte value, Word metaDataA, Word metaDataB, int mode) {
064 VM.barriers.byteWrite(src, value, metaDataA, metaDataB, mode);
065 }
066
067 @Override
068 public boolean byteBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
069 return false;
070 }
071
072 /**
073 * Write a char. Take appropriate write barrier actions.<p>
074 */
075 @Override
076 public void charWrite(ObjectReference src, Address slot, char value, Word metaDataA, Word metaDataB, int mode) {
077 VM.barriers.charWrite(src, value, metaDataA, metaDataB, mode);
078 }
079
080 @Override
081 public boolean charBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
082 return false;
083 }
084
085 /**
086 * Write a double. Take appropriate write barrier actions.<p>
087 */
088 @Override
089 public void doubleWrite(ObjectReference src, Address slot, double value, Word metaDataA, Word metaDataB, int mode) {
090 VM.barriers.doubleWrite(src, value, metaDataA, metaDataB, mode);
091 }
092
093 @Override
094 public boolean doubleBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
095 return false;
096 }
097
098 /**
099 * Write an Extent. Take appropriate write barrier actions.<p>
100 */
101 @Override
102 public void extentWrite(ObjectReference src, Address slot, Extent value, Word metaDataA, Word metaDataB, int mode) {
103 VM.barriers.extentWrite(src, value, metaDataA, metaDataB, mode);
104 }
105
106 /**
107 * Write a float. Take appropriate write barrier actions.<p>
108 */
109 @Override
110 public void floatWrite(ObjectReference src, Address slot, float value, Word metaDataA, Word metaDataB, int mode) {
111 VM.barriers.floatWrite(src, value, metaDataA, metaDataB, mode);
112 }
113
114 @Override
115 public boolean floatBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
116 return false;
117 }
118
119 /**
120 * Write a int. Take appropriate write barrier actions.<p>
121 */
122 @Override
123 public void intWrite(ObjectReference src, Address slot, int value, Word metaDataA, Word metaDataB, int mode) {
124 VM.barriers.intWrite(src, value, metaDataA, metaDataB, mode);
125 }
126
127 @Override
128 public boolean intBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
129 return false;
130 }
131
132 @Override
133 public boolean intTryCompareAndSwap(ObjectReference src, Address slot, int old, int value, Word metaDataA, Word metaDataB, int mode) {
134 return VM.barriers.intTryCompareAndSwap(src, old, value, metaDataA, metaDataB, mode);
135 }
136
137 /**
138 * Write a long. Take appropriate write barrier actions.<p>
139 */
140 @Override
141 public void longWrite(ObjectReference src, Address slot, long value, Word metaDataA, Word metaDataB, int mode) {
142 VM.barriers.longWrite(src, value, metaDataA, metaDataB, mode);
143 }
144
145 @Override
146 public boolean longBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
147 return false;
148 }
149
150 @Override
151 public boolean longTryCompareAndSwap(ObjectReference src, Address slot, long old, long value, Word metaDataA, Word metaDataB, int mode) {
152 return VM.barriers.longTryCompareAndSwap(src, old, value, metaDataA, metaDataB, mode);
153 }
154
155 /**
156 * Write an Offset. Take appropriate write barrier actions.<p>
157 */
158 @Override
159 public void offsetWrite(ObjectReference src, Address slot, Offset value, Word metaDataA, Word metaDataB, int mode) {
160 VM.barriers.offsetWrite(src, value, metaDataA, metaDataB, mode);
161 }
162
163 /**
164 * Write a short. Take appropriate write barrier actions.<p>
165 */
166 @Override
167 public void shortWrite(ObjectReference src, Address slot, short value, Word metaDataA, Word metaDataB, int mode) {
168 VM.barriers.shortWrite(src, value, metaDataA, metaDataB, mode);
169 }
170
171 @Override
172 public boolean shortBulkCopy(ObjectReference src, Offset srcOffset, ObjectReference dst, Offset dstOffset, int bytes) {
173 return false;
174 }
175
176 /**
177 * Write a Word. Take appropriate write barrier actions.<p>
178 */
179 @Override
180 public void wordWrite(ObjectReference src, Address slot, Word value, Word metaDataA, Word metaDataB, int mode) {
181 VM.barriers.wordWrite(src, value, metaDataA, metaDataB, mode);
182 }
183
184 @Override
185 public boolean wordTryCompareAndSwap(ObjectReference src, Address slot, Word old, Word value, Word metaDataA, Word metaDataB, int mode) {
186 return VM.barriers.wordTryCompareAndSwap(src, old, value, metaDataA, metaDataB, mode);
187 }
188 }