14d77dafb032e6e14ce619842dec70862172dbaeeAlex Light/* 24d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * Copyright (C) 2017 The Android Open Source Project 34d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * 44d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * Licensed under the Apache License, Version 2.0 (the "License"); 54d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * you may not use this file except in compliance with the License. 64d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * You may obtain a copy of the License at 74d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * 84d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * http://www.apache.org/licenses/LICENSE-2.0 94d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * 104d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * Unless required by applicable law or agreed to in writing, software 114d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * distributed under the License is distributed on an "AS IS" BASIS, 124d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * See the License for the specific language governing permissions and 144d77dafb032e6e14ce619842dec70862172dbaeeAlex Light * limitations under the License. 154d77dafb032e6e14ce619842dec70862172dbaeeAlex Light */ 164d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 174d77dafb032e6e14ce619842dec70862172dbaeeAlex Light#include <atomic> 184d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 194d77dafb032e6e14ce619842dec70862172dbaeeAlex Light#include "android-base/logging.h" 204d77dafb032e6e14ce619842dec70862172dbaeeAlex Light#include "jni.h" 214d77dafb032e6e14ce619842dec70862172dbaeeAlex Light#include "scoped_local_ref.h" 224d77dafb032e6e14ce619842dec70862172dbaeeAlex Light#include "scoped_primitive_array.h" 234d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 244d77dafb032e6e14ce619842dec70862172dbaeeAlex Light#include "jvmti.h" 254d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 264d77dafb032e6e14ce619842dec70862172dbaeeAlex Light// Test infrastructure 274d77dafb032e6e14ce619842dec70862172dbaeeAlex Light#include "jvmti_helper.h" 284d77dafb032e6e14ce619842dec70862172dbaeeAlex Light#include "test_env.h" 294d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 304d77dafb032e6e14ce619842dec70862172dbaeeAlex Lightnamespace art { 314d77dafb032e6e14ce619842dec70862172dbaeeAlex Lightnamespace Test1943SuspendRawMonitorExit { 324d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 334d77dafb032e6e14ce619842dec70862172dbaeeAlex LightjrawMonitorID mon; 344d77dafb032e6e14ce619842dec70862172dbaeeAlex Lightstd::atomic<bool> locked(false); 354d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 364d77dafb032e6e14ce619842dec70862172dbaeeAlex Lightextern "C" JNIEXPORT void JNICALL Java_art_Test1943_nativeRun(JNIEnv* env, jclass) { 374d77dafb032e6e14ce619842dec70862172dbaeeAlex Light if (JvmtiErrorToException( 384d77dafb032e6e14ce619842dec70862172dbaeeAlex Light env, jvmti_env, jvmti_env->CreateRawMonitor("Test1943 monitor", &mon))) { 394d77dafb032e6e14ce619842dec70862172dbaeeAlex Light return; 404d77dafb032e6e14ce619842dec70862172dbaeeAlex Light } 414d77dafb032e6e14ce619842dec70862172dbaeeAlex Light // Grab the monitor twice 424d77dafb032e6e14ce619842dec70862172dbaeeAlex Light if (JvmtiErrorToException(env, jvmti_env, jvmti_env->RawMonitorEnter(mon))) { 434d77dafb032e6e14ce619842dec70862172dbaeeAlex Light return; 444d77dafb032e6e14ce619842dec70862172dbaeeAlex Light } 454d77dafb032e6e14ce619842dec70862172dbaeeAlex Light locked.store(true); 464d77dafb032e6e14ce619842dec70862172dbaeeAlex Light if (JvmtiErrorToException(env, jvmti_env, jvmti_env->RawMonitorWait(mon, 0))) { 474d77dafb032e6e14ce619842dec70862172dbaeeAlex Light return; 484d77dafb032e6e14ce619842dec70862172dbaeeAlex Light } 494d77dafb032e6e14ce619842dec70862172dbaeeAlex Light if (JvmtiErrorToException(env, jvmti_env, jvmti_env->RawMonitorExit(mon))) { 504d77dafb032e6e14ce619842dec70862172dbaeeAlex Light return; 514d77dafb032e6e14ce619842dec70862172dbaeeAlex Light } 524d77dafb032e6e14ce619842dec70862172dbaeeAlex Light locked.store(false); 534d77dafb032e6e14ce619842dec70862172dbaeeAlex Light} 544d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 554d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 564d77dafb032e6e14ce619842dec70862172dbaeeAlex Lightextern "C" JNIEXPORT void JNICALL Java_art_Test1943_waitForPause(JNIEnv*, jclass) { 574d77dafb032e6e14ce619842dec70862172dbaeeAlex Light while (!locked.load()) { } 584d77dafb032e6e14ce619842dec70862172dbaeeAlex Light} 594d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 604d77dafb032e6e14ce619842dec70862172dbaeeAlex Lightextern "C" JNIEXPORT void JNICALL Java_art_Test1943_nativeNotify(JNIEnv* env, jclass) { 614d77dafb032e6e14ce619842dec70862172dbaeeAlex Light if (JvmtiErrorToException(env, jvmti_env, jvmti_env->RawMonitorEnter(mon))) { 624d77dafb032e6e14ce619842dec70862172dbaeeAlex Light return; 634d77dafb032e6e14ce619842dec70862172dbaeeAlex Light } 644d77dafb032e6e14ce619842dec70862172dbaeeAlex Light if (JvmtiErrorToException(env, jvmti_env, jvmti_env->RawMonitorNotifyAll(mon))) { 654d77dafb032e6e14ce619842dec70862172dbaeeAlex Light return; 664d77dafb032e6e14ce619842dec70862172dbaeeAlex Light } 674d77dafb032e6e14ce619842dec70862172dbaeeAlex Light if (JvmtiErrorToException(env, jvmti_env, jvmti_env->RawMonitorExit(mon))) { 684d77dafb032e6e14ce619842dec70862172dbaeeAlex Light return; 694d77dafb032e6e14ce619842dec70862172dbaeeAlex Light } 704d77dafb032e6e14ce619842dec70862172dbaeeAlex Light} 714d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 724d77dafb032e6e14ce619842dec70862172dbaeeAlex Lightextern "C" JNIEXPORT void JNICALL Java_art_Test1943_grabRawMonitor(JNIEnv* env, jclass) { 734d77dafb032e6e14ce619842dec70862172dbaeeAlex Light if (JvmtiErrorToException(env, jvmti_env, jvmti_env->RawMonitorEnter(mon))) { 744d77dafb032e6e14ce619842dec70862172dbaeeAlex Light return; 754d77dafb032e6e14ce619842dec70862172dbaeeAlex Light } 764d77dafb032e6e14ce619842dec70862172dbaeeAlex Light if (JvmtiErrorToException(env, jvmti_env, jvmti_env->RawMonitorExit(mon))) { 774d77dafb032e6e14ce619842dec70862172dbaeeAlex Light return; 784d77dafb032e6e14ce619842dec70862172dbaeeAlex Light } 794d77dafb032e6e14ce619842dec70862172dbaeeAlex Light} 804d77dafb032e6e14ce619842dec70862172dbaeeAlex Light 814d77dafb032e6e14ce619842dec70862172dbaeeAlex Light} // namespace Test1943SuspendRawMonitorExit 824d77dafb032e6e14ce619842dec70862172dbaeeAlex Light} // namespace art 83