equal
deleted
inserted
replaced
148 void* addr() { |
148 void* addr() { |
149 return index_oop_from_field_offset_long(JNIHandles::resolve(_obj), _offset); |
149 return index_oop_from_field_offset_long(JNIHandles::resolve(_obj), _offset); |
150 } |
150 } |
151 |
151 |
152 template <typename T> |
152 template <typename T> |
153 T normalize(T x) { |
153 T normalize_for_write(T x) { |
154 return x; |
154 return x; |
155 } |
155 } |
156 |
156 |
157 jboolean normalize(jboolean x) { |
157 jboolean normalize_for_write(jboolean x) { |
158 return x & 1; |
158 return x & 1; |
|
159 } |
|
160 |
|
161 template <typename T> |
|
162 T normalize_for_read(T x) { |
|
163 return x; |
|
164 } |
|
165 |
|
166 jboolean normalize_for_read(jboolean x) { |
|
167 return x != 0; |
159 } |
168 } |
160 |
169 |
161 /** |
170 /** |
162 * Helper class to wrap memory accesses in JavaThread::doing_unsafe_access() |
171 * Helper class to wrap memory accesses in JavaThread::doing_unsafe_access() |
163 */ |
172 */ |
194 T get() { |
203 T get() { |
195 GuardUnsafeAccess guard(_thread, _obj); |
204 GuardUnsafeAccess guard(_thread, _obj); |
196 |
205 |
197 T* p = (T*)addr(); |
206 T* p = (T*)addr(); |
198 |
207 |
199 T x = *p; |
208 T x = normalize_for_read(*p); |
200 |
209 |
201 return x; |
210 return x; |
202 } |
211 } |
203 |
212 |
204 template <typename T> |
213 template <typename T> |
205 void put(T x) { |
214 void put(T x) { |
206 GuardUnsafeAccess guard(_thread, _obj); |
215 GuardUnsafeAccess guard(_thread, _obj); |
207 |
216 |
208 T* p = (T*)addr(); |
217 T* p = (T*)addr(); |
209 |
218 |
210 *p = normalize(x); |
219 *p = normalize_for_write(x); |
211 } |
220 } |
212 |
221 |
213 |
222 |
214 template <typename T> |
223 template <typename T> |
215 T get_volatile() { |
224 T get_volatile() { |
221 OrderAccess::fence(); |
230 OrderAccess::fence(); |
222 } |
231 } |
223 |
232 |
224 T x = OrderAccess::load_acquire((volatile T*)p); |
233 T x = OrderAccess::load_acquire((volatile T*)p); |
225 |
234 |
226 return x; |
235 return normalize_for_read(x); |
227 } |
236 } |
228 |
237 |
229 template <typename T> |
238 template <typename T> |
230 void put_volatile(T x) { |
239 void put_volatile(T x) { |
231 GuardUnsafeAccess guard(_thread, _obj); |
240 GuardUnsafeAccess guard(_thread, _obj); |
232 |
241 |
233 T* p = (T*)addr(); |
242 T* p = (T*)addr(); |
234 |
243 |
235 OrderAccess::release_store_fence((volatile T*)p, normalize(x)); |
244 OrderAccess::release_store_fence((volatile T*)p, normalize_for_write(x)); |
236 } |
245 } |
237 |
246 |
238 |
247 |
239 #ifndef SUPPORTS_NATIVE_CX8 |
248 #ifndef SUPPORTS_NATIVE_CX8 |
240 jlong get_jlong_locked() { |
249 jlong get_jlong_locked() { |
254 |
263 |
255 MutexLockerEx mu(UnsafeJlong_lock, Mutex::_no_safepoint_check_flag); |
264 MutexLockerEx mu(UnsafeJlong_lock, Mutex::_no_safepoint_check_flag); |
256 |
265 |
257 jlong* p = (jlong*)addr(); |
266 jlong* p = (jlong*)addr(); |
258 |
267 |
259 Atomic::store(normalize(x), p); |
268 Atomic::store(normalize_for_write(x), p); |
260 } |
269 } |
261 #endif |
270 #endif |
262 }; |
271 }; |
263 |
272 |
264 // Get/PutObject must be special-cased, since it works with handles. |
273 // Get/PutObject must be special-cased, since it works with handles. |