sun_misc_Unsafe.cc revision ef7d42fca18c16fbaf103822ad16f23246e2905d
1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "gc/accounting/card_table-inl.h" 18#include "jni_internal.h" 19#include "mirror/object.h" 20#include "mirror/object-inl.h" 21#include "scoped_fast_native_object_access.h" 22 23namespace art { 24 25static jboolean Unsafe_compareAndSwapInt(JNIEnv* env, jobject, jobject javaObj, jlong offset, 26 jint expectedValue, jint newValue) { 27 ScopedFastNativeObjectAccess soa(env); 28 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 29 bool success = obj->CasField32(MemberOffset(offset), expectedValue, newValue); 30 return success ? JNI_TRUE : JNI_FALSE; 31} 32 33static jboolean Unsafe_compareAndSwapLong(JNIEnv* env, jobject, jobject javaObj, jlong offset, 34 jlong expectedValue, jlong newValue) { 35 ScopedFastNativeObjectAccess soa(env); 36 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 37 bool success = obj->CasField64(MemberOffset(offset), expectedValue, newValue); 38 return success ? JNI_TRUE : JNI_FALSE; 39} 40 41static jboolean Unsafe_compareAndSwapObject(JNIEnv* env, jobject, jobject javaObj, jlong offset, 42 jobject javaExpectedValue, jobject javaNewValue) { 43 ScopedFastNativeObjectAccess soa(env); 44 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 45 mirror::Object* expectedValue = soa.Decode<mirror::Object*>(javaExpectedValue); 46 mirror::Object* newValue = soa.Decode<mirror::Object*>(javaNewValue); 47 bool success = obj->CasFieldObject(MemberOffset(offset), expectedValue, newValue); 48 return success ? JNI_TRUE : JNI_FALSE; 49} 50 51static jint Unsafe_getInt(JNIEnv* env, jobject, jobject javaObj, jlong offset) { 52 ScopedFastNativeObjectAccess soa(env); 53 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 54 return obj->GetField32(MemberOffset(offset), false); 55} 56 57static jint Unsafe_getIntVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset) { 58 ScopedFastNativeObjectAccess soa(env); 59 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 60 return obj->GetField32(MemberOffset(offset), true); 61} 62 63static void Unsafe_putInt(JNIEnv* env, jobject, jobject javaObj, jlong offset, jint newValue) { 64 ScopedFastNativeObjectAccess soa(env); 65 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 66 obj->SetField32(MemberOffset(offset), newValue, false); 67} 68 69static void Unsafe_putIntVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset, 70 jint newValue) { 71 ScopedFastNativeObjectAccess soa(env); 72 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 73 obj->SetField32(MemberOffset(offset), newValue, true); 74} 75 76static void Unsafe_putOrderedInt(JNIEnv* env, jobject, jobject javaObj, jlong offset, 77 jint newValue) { 78 ScopedFastNativeObjectAccess soa(env); 79 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 80 QuasiAtomic::MembarStoreStore(); 81 obj->SetField32(MemberOffset(offset), newValue, false); 82} 83 84static jlong Unsafe_getLong(JNIEnv* env, jobject, jobject javaObj, jlong offset) { 85 ScopedFastNativeObjectAccess soa(env); 86 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 87 return obj->GetField64(MemberOffset(offset), false); 88} 89 90static jlong Unsafe_getLongVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset) { 91 ScopedFastNativeObjectAccess soa(env); 92 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 93 return obj->GetField64(MemberOffset(offset), true); 94} 95 96static void Unsafe_putLong(JNIEnv* env, jobject, jobject javaObj, jlong offset, jlong newValue) { 97 ScopedFastNativeObjectAccess soa(env); 98 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 99 obj->SetField64(MemberOffset(offset), newValue, false); 100} 101 102static void Unsafe_putLongVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset, 103 jlong newValue) { 104 ScopedFastNativeObjectAccess soa(env); 105 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 106 obj->SetField64(MemberOffset(offset), newValue, true); 107} 108 109static void Unsafe_putOrderedLong(JNIEnv* env, jobject, jobject javaObj, jlong offset, 110 jlong newValue) { 111 ScopedFastNativeObjectAccess soa(env); 112 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 113 QuasiAtomic::MembarStoreStore(); 114 obj->SetField64(MemberOffset(offset), newValue, false); 115} 116 117static jobject Unsafe_getObjectVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset) { 118 ScopedFastNativeObjectAccess soa(env); 119 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 120 mirror::Object* value = obj->GetFieldObject<mirror::Object>(MemberOffset(offset), true); 121 return soa.AddLocalReference<jobject>(value); 122} 123 124static jobject Unsafe_getObject(JNIEnv* env, jobject, jobject javaObj, jlong offset) { 125 ScopedFastNativeObjectAccess soa(env); 126 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 127 mirror::Object* value = obj->GetFieldObject<mirror::Object>(MemberOffset(offset), false); 128 return soa.AddLocalReference<jobject>(value); 129} 130 131static void Unsafe_putObject(JNIEnv* env, jobject, jobject javaObj, jlong offset, 132 jobject javaNewValue) { 133 ScopedFastNativeObjectAccess soa(env); 134 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 135 mirror::Object* newValue = soa.Decode<mirror::Object*>(javaNewValue); 136 obj->SetFieldObject(MemberOffset(offset), newValue, false); 137} 138 139static void Unsafe_putObjectVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset, 140 jobject javaNewValue) { 141 ScopedFastNativeObjectAccess soa(env); 142 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 143 mirror::Object* newValue = soa.Decode<mirror::Object*>(javaNewValue); 144 obj->SetFieldObject(MemberOffset(offset), newValue, true); 145} 146 147static void Unsafe_putOrderedObject(JNIEnv* env, jobject, jobject javaObj, jlong offset, 148 jobject javaNewValue) { 149 ScopedFastNativeObjectAccess soa(env); 150 mirror::Object* obj = soa.Decode<mirror::Object*>(javaObj); 151 mirror::Object* newValue = soa.Decode<mirror::Object*>(javaNewValue); 152 QuasiAtomic::MembarStoreStore(); 153 obj->SetFieldObject(MemberOffset(offset), newValue, false); 154} 155 156static JNINativeMethod gMethods[] = { 157 NATIVE_METHOD(Unsafe, compareAndSwapInt, "!(Ljava/lang/Object;JII)Z"), 158 NATIVE_METHOD(Unsafe, compareAndSwapLong, "!(Ljava/lang/Object;JJJ)Z"), 159 NATIVE_METHOD(Unsafe, compareAndSwapObject, "!(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z"), 160 NATIVE_METHOD(Unsafe, getIntVolatile, "!(Ljava/lang/Object;J)I"), 161 NATIVE_METHOD(Unsafe, putIntVolatile, "!(Ljava/lang/Object;JI)V"), 162 NATIVE_METHOD(Unsafe, getLongVolatile, "!(Ljava/lang/Object;J)J"), 163 NATIVE_METHOD(Unsafe, putLongVolatile, "!(Ljava/lang/Object;JJ)V"), 164 NATIVE_METHOD(Unsafe, getObjectVolatile, "!(Ljava/lang/Object;J)Ljava/lang/Object;"), 165 NATIVE_METHOD(Unsafe, putObjectVolatile, "!(Ljava/lang/Object;JLjava/lang/Object;)V"), 166 NATIVE_METHOD(Unsafe, getInt, "!(Ljava/lang/Object;J)I"), 167 NATIVE_METHOD(Unsafe, putInt, "!(Ljava/lang/Object;JI)V"), 168 NATIVE_METHOD(Unsafe, putOrderedInt, "!(Ljava/lang/Object;JI)V"), 169 NATIVE_METHOD(Unsafe, getLong, "!(Ljava/lang/Object;J)J"), 170 NATIVE_METHOD(Unsafe, putLong, "!(Ljava/lang/Object;JJ)V"), 171 NATIVE_METHOD(Unsafe, putOrderedLong, "!(Ljava/lang/Object;JJ)V"), 172 NATIVE_METHOD(Unsafe, getObject, "!(Ljava/lang/Object;J)Ljava/lang/Object;"), 173 NATIVE_METHOD(Unsafe, putObject, "!(Ljava/lang/Object;JLjava/lang/Object;)V"), 174 NATIVE_METHOD(Unsafe, putOrderedObject, "!(Ljava/lang/Object;JLjava/lang/Object;)V"), 175}; 176 177void register_sun_misc_Unsafe(JNIEnv* env) { 178 REGISTER_NATIVE_METHODS("sun/misc/Unsafe"); 179} 180 181} // namespace art 182