376 DEFINE_GETSETOOP_VOLATILE(jlong, Long); |
376 DEFINE_GETSETOOP_VOLATILE(jlong, Long); |
377 #endif |
377 #endif |
378 |
378 |
379 #undef DEFINE_GETSETOOP_VOLATILE |
379 #undef DEFINE_GETSETOOP_VOLATILE |
380 |
380 |
381 // The non-intrinsified versions of setOrdered just use setVolatile |
|
382 |
|
383 UNSAFE_ENTRY(void, Unsafe_SetOrderedInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint x)) { |
|
384 SET_FIELD_VOLATILE(obj, offset, jint, x); |
|
385 } UNSAFE_END |
|
386 |
|
387 UNSAFE_ENTRY(void, Unsafe_SetOrderedObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { |
|
388 oop x = JNIHandles::resolve(x_h); |
|
389 oop p = JNIHandles::resolve(obj); |
|
390 void* addr = index_oop_from_field_offset_long(p, offset); |
|
391 OrderAccess::release(); |
|
392 |
|
393 if (UseCompressedOops) { |
|
394 oop_store((narrowOop*)addr, x); |
|
395 } else { |
|
396 oop_store((oop*)addr, x); |
|
397 } |
|
398 |
|
399 OrderAccess::fence(); |
|
400 } UNSAFE_END |
|
401 |
|
402 UNSAFE_ENTRY(void, Unsafe_SetOrderedLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong x)) { |
|
403 #ifdef SUPPORTS_NATIVE_CX8 |
|
404 SET_FIELD_VOLATILE(obj, offset, jlong, x); |
|
405 #else |
|
406 |
|
407 // Keep old code for platforms which may not have atomic long (8 bytes) instructions |
|
408 if (VM_Version::supports_cx8()) { |
|
409 SET_FIELD_VOLATILE(obj, offset, jlong, x); |
|
410 } else { |
|
411 Handle p(THREAD, JNIHandles::resolve(obj)); |
|
412 jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset)); |
|
413 MutexLockerEx mu(UnsafeJlong_lock, Mutex::_no_safepoint_check_flag); |
|
414 Atomic::store(x, addr); |
|
415 } |
|
416 #endif |
|
417 } UNSAFE_END |
|
418 |
|
419 UNSAFE_LEAF(void, Unsafe_LoadFence(JNIEnv *env, jobject unsafe)) { |
381 UNSAFE_LEAF(void, Unsafe_LoadFence(JNIEnv *env, jobject unsafe)) { |
420 OrderAccess::acquire(); |
382 OrderAccess::acquire(); |
421 } UNSAFE_END |
383 } UNSAFE_END |
422 |
384 |
423 UNSAFE_LEAF(void, Unsafe_StoreFence(JNIEnv *env, jobject unsafe)) { |
385 UNSAFE_LEAF(void, Unsafe_StoreFence(JNIEnv *env, jobject unsafe)) { |
1228 {CC "compareAndSwapLong", CC "(" OBJ "J""J""J"")Z", FN_PTR(Unsafe_CompareAndSwapLong)}, |
1190 {CC "compareAndSwapLong", CC "(" OBJ "J""J""J"")Z", FN_PTR(Unsafe_CompareAndSwapLong)}, |
1229 {CC "compareAndExchangeObjectVolatile", CC "(" OBJ "J" OBJ "" OBJ ")" OBJ, FN_PTR(Unsafe_CompareAndExchangeObject)}, |
1191 {CC "compareAndExchangeObjectVolatile", CC "(" OBJ "J" OBJ "" OBJ ")" OBJ, FN_PTR(Unsafe_CompareAndExchangeObject)}, |
1230 {CC "compareAndExchangeIntVolatile", CC "(" OBJ "J""I""I"")I", FN_PTR(Unsafe_CompareAndExchangeInt)}, |
1192 {CC "compareAndExchangeIntVolatile", CC "(" OBJ "J""I""I"")I", FN_PTR(Unsafe_CompareAndExchangeInt)}, |
1231 {CC "compareAndExchangeLongVolatile", CC "(" OBJ "J""J""J"")J", FN_PTR(Unsafe_CompareAndExchangeLong)}, |
1193 {CC "compareAndExchangeLongVolatile", CC "(" OBJ "J""J""J"")J", FN_PTR(Unsafe_CompareAndExchangeLong)}, |
1232 |
1194 |
1233 {CC "putOrderedObject", CC "(" OBJ "J" OBJ ")V", FN_PTR(Unsafe_SetOrderedObject)}, |
|
1234 {CC "putOrderedInt", CC "(" OBJ "JI)V", FN_PTR(Unsafe_SetOrderedInt)}, |
|
1235 {CC "putOrderedLong", CC "(" OBJ "JJ)V", FN_PTR(Unsafe_SetOrderedLong)}, |
|
1236 {CC "park", CC "(ZJ)V", FN_PTR(Unsafe_Park)}, |
1195 {CC "park", CC "(ZJ)V", FN_PTR(Unsafe_Park)}, |
1237 {CC "unpark", CC "(" OBJ ")V", FN_PTR(Unsafe_Unpark)}, |
1196 {CC "unpark", CC "(" OBJ ")V", FN_PTR(Unsafe_Unpark)}, |
1238 |
1197 |
1239 {CC "getLoadAverage0", CC "([DI)I", FN_PTR(Unsafe_GetLoadAverage0)}, |
1198 {CC "getLoadAverage0", CC "([DI)I", FN_PTR(Unsafe_GetLoadAverage0)}, |
1240 |
1199 |