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