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