114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier/* 214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * Copyright (C) 2015 The Android Open Source Project 314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * 414f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 514f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * you may not use this file except in compliance with the License. 614f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * You may obtain a copy of the License at 714f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * 814f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 914f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * 1014f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * Unless required by applicable law or agreed to in writing, software 1114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 1214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * See the License for the specific language governing permissions and 1414f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier * limitations under the License. 1514f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier */ 1614f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 1714f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier#include "jni.h" 1814f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 1914f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier#include "mirror/class-inl.h" 2014f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier#include "scoped_thread_state_change.h" 2114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 2214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartiernamespace art { 2314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartiernamespace { 2414f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 2514f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartierextern "C" JNIEXPORT void JNICALL Java_JObjectBenchmark_timeAddRemoveLocal( 2614f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier JNIEnv* env, jobject jobj, jint reps) { 2714f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier ScopedObjectAccess soa(env); 2814f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier mirror::Object* obj = soa.Decode<mirror::Object*>(jobj); 2914f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier CHECK(obj != nullptr); 3014f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier for (jint i = 0; i < reps; ++i) { 3114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier jobject ref = soa.Env()->AddLocalReference<jobject>(obj); 3214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier soa.Env()->DeleteLocalRef(ref); 3314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier } 3414f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier} 3514f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 3614f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartierextern "C" JNIEXPORT void JNICALL Java_JObjectBenchmark_timeDecodeLocal( 3714f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier JNIEnv* env, jobject jobj, jint reps) { 3814f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier ScopedObjectAccess soa(env); 3914f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier mirror::Object* obj = soa.Decode<mirror::Object*>(jobj); 4014f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier CHECK(obj != nullptr); 4114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier jobject ref = soa.Env()->AddLocalReference<jobject>(obj); 4214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier for (jint i = 0; i < reps; ++i) { 4314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier CHECK_EQ(soa.Decode<mirror::Object*>(ref), obj); 4414f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier } 4514f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier soa.Env()->DeleteLocalRef(ref); 4614f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier} 4714f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 4814f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartierextern "C" JNIEXPORT void JNICALL Java_JObjectBenchmark_timeAddRemoveGlobal( 4914f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier JNIEnv* env, jobject jobj, jint reps) { 5014f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier ScopedObjectAccess soa(env); 5114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier mirror::Object* obj = soa.Decode<mirror::Object*>(jobj); 5214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier CHECK(obj != nullptr); 5314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier for (jint i = 0; i < reps; ++i) { 5414f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier jobject ref = soa.Vm()->AddGlobalRef(soa.Self(), obj); 5514f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier soa.Vm()->DeleteGlobalRef(soa.Self(), ref); 5614f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier } 5714f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier} 5814f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 5914f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartierextern "C" JNIEXPORT void JNICALL Java_JObjectBenchmark_timeDecodeGlobal( 6014f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier JNIEnv* env, jobject jobj, jint reps) { 6114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier ScopedObjectAccess soa(env); 6214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier mirror::Object* obj = soa.Decode<mirror::Object*>(jobj); 6314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier CHECK(obj != nullptr); 6414f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier jobject ref = soa.Vm()->AddGlobalRef(soa.Self(), obj); 6514f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier for (jint i = 0; i < reps; ++i) { 6614f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier CHECK_EQ(soa.Decode<mirror::Object*>(ref), obj); 6714f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier } 6814f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier soa.Vm()->DeleteGlobalRef(soa.Self(), ref); 6914f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier} 7014f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 7114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartierextern "C" JNIEXPORT void JNICALL Java_JObjectBenchmark_timeAddRemoveWeakGlobal( 7214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier JNIEnv* env, jobject jobj, jint reps) { 7314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier ScopedObjectAccess soa(env); 7414f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier mirror::Object* obj = soa.Decode<mirror::Object*>(jobj); 7514f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier CHECK(obj != nullptr); 7614f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier for (jint i = 0; i < reps; ++i) { 7714f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier jobject ref = soa.Vm()->AddWeakGlobalRef(soa.Self(), obj); 7814f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier soa.Vm()->DeleteWeakGlobalRef(soa.Self(), ref); 7914f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier } 8014f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier} 8114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 8214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartierextern "C" JNIEXPORT void JNICALL Java_JObjectBenchmark_timeDecodeWeakGlobal( 8314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier JNIEnv* env, jobject jobj, jint reps) { 8414f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier ScopedObjectAccess soa(env); 8514f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier mirror::Object* obj = soa.Decode<mirror::Object*>(jobj); 8614f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier CHECK(obj != nullptr); 8714f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier jobject ref = soa.Vm()->AddWeakGlobalRef(soa.Self(), obj); 8814f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier for (jint i = 0; i < reps; ++i) { 8914f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier CHECK_EQ(soa.Decode<mirror::Object*>(ref), obj); 9014f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier } 9114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier soa.Vm()->DeleteWeakGlobalRef(soa.Self(), ref); 9214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier} 9314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 9414f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartierextern "C" JNIEXPORT void JNICALL Java_JObjectBenchmark_timeDecodeHandleScopeRef( 9514f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier JNIEnv* env, jobject jobj, jint reps) { 9614f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier ScopedObjectAccess soa(env); 9714f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier for (jint i = 0; i < reps; ++i) { 9814f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier soa.Decode<mirror::Object*>(jobj); 9914f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier } 10014f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier} 10114f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier 10214f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier} // namespace 10314f8b13d2593770b7f5387a33f6a8400c20aaa8eMathieu Chartier} // namespace art 104