< prev index next >

test/hotspot/jtreg/vmTestbase/nsk/jvmti/RawMonitorWait/rawmnwait005/rawmnwait005.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 35,45 **** #define MILLIS_PER_MINUTE (60 * 1000) static jvmtiEnv *jvmti = NULL; static jvmtiCapabilities caps; static jint result = PASSED; ! static jboolean printdump = JNI_FALSE; static jrawMonitorID monitor; static jrawMonitorID wait_lock; static jlong wait_time; #ifdef STATIC_BUILD --- 35,45 ---- #define MILLIS_PER_MINUTE (60 * 1000) static jvmtiEnv *jvmti = NULL; static jvmtiCapabilities caps; static jint result = PASSED; ! static jboolean printdump = JNI_TRUE; static jrawMonitorID monitor; static jrawMonitorID wait_lock; static jlong wait_time; #ifdef STATIC_BUILD
*** 98,117 **** --- 98,120 ---- static void JNICALL test_thread(jvmtiEnv* jvmti, JNIEnv* jni, void *unused) { jvmtiError err; const char* const thread_name = "test thread"; + // Once we hold this monitor we know we can't get interrupted + // until we have called wait(). err = jvmti->RawMonitorEnter(monitor); if (err != JVMTI_ERROR_NONE) { printf("(RawMonitorEnter#test) unexpected error: %s (%d)\n", TranslateError(err), err); result = STATUS_FAILED; } if (printdump == JNI_TRUE) { printf(">>> [%s] acquired lock for 'monitor' ...\n", thread_name); } + // We can't get this monitor until the main thread has called wait() on it. err = jvmti->RawMonitorEnter(wait_lock); if (err != JVMTI_ERROR_NONE) { printf("(RawMonitorEnter#wait) unexpected error: %s (%d)\n", TranslateError(err), err); result = STATUS_FAILED;
*** 154,163 **** --- 157,196 ---- printf("(RawMonitorExit#test) unexpected error: %s (%d)\n", TranslateError(err), err); result = STATUS_FAILED; } + // We can't reacquire this monitor until the main thread is waiting for us to + // complete. + err = jvmti->RawMonitorEnter(wait_lock); + if (err != JVMTI_ERROR_NONE) { + printf("(RawMonitorEnter#wait) unexpected error: %s (%d)\n", + TranslateError(err), err); + result = STATUS_FAILED; + return; + } + + if (printdump == JNI_TRUE) { + printf(">>> [%s] acquired lock for 'wait_lock' ...\n", thread_name); + printf(">>> [%s] notifying main thread we are done ...\n", thread_name); + } + + err = jvmti->RawMonitorNotify(wait_lock); + if (err != JVMTI_ERROR_NONE) { + printf("(RawMonitorWait#wait) unexpected error: %s (%d)\n", + TranslateError(err), err); + result = STATUS_FAILED; + return; + } + err = jvmti->RawMonitorExit(wait_lock); + if (err != JVMTI_ERROR_NONE) { + printf("(RawMonitorExit#wait) unexpected error: %s (%d)\n", + TranslateError(err), err); + result = STATUS_FAILED; + return; + } + if (printdump == JNI_TRUE) { printf(">>> [%s] all done\n", thread_name); } }
*** 221,230 **** --- 254,268 ---- } if (printdump == JNI_TRUE) { printf(">>> [%s] starting test thread ...\n", thread_name); } + + // This starts a daemon thread, so we need to synchronize with it + // before we terminate - else the test will end before it checks + // it was interrupted! + err = jvmti->RunAgentThread(thr, test_thread, NULL, JVMTI_THREAD_NORM_PRIORITY); if (err != JVMTI_ERROR_NONE) { printf("(RunDebugThread) unexpected error: %s (%d)\n", TranslateError(err), err);
*** 242,257 **** } if (printdump == JNI_TRUE) { printf(">>> [%s] got notification from test thread ...\n", thread_name); } ! err = jvmti->RawMonitorExit(wait_lock); ! if (err != JVMTI_ERROR_NONE) { ! printf("(RawMonitorExit#wait) unexpected error: %s (%d)\n", ! TranslateError(err), err); ! return STATUS_FAILED; ! } err = jvmti->RawMonitorEnter(monitor); if (err != JVMTI_ERROR_NONE) { printf("(RawMonitorEnter#test) unexpected error: %s (%d)\n", TranslateError(err), err); --- 280,290 ---- } if (printdump == JNI_TRUE) { printf(">>> [%s] got notification from test thread ...\n", thread_name); } ! // Keep the wait_lock so we can wait again at the end. err = jvmti->RawMonitorEnter(monitor); if (err != JVMTI_ERROR_NONE) { printf("(RawMonitorEnter#test) unexpected error: %s (%d)\n", TranslateError(err), err);
*** 278,287 **** --- 311,340 ---- TranslateError(err), err); result = STATUS_FAILED; } if (printdump == JNI_TRUE) { + printf(">>> [%s] waiting for test thread to complete its wait and notify us ...\n", thread_name); + } + err = jvmti->RawMonitorWait(wait_lock, (jlong)0); + if (err != JVMTI_ERROR_NONE) { + printf("(RawMonitorWait#wait) unexpected error: %s (%d)\n", + TranslateError(err), err); + return STATUS_FAILED; + } + if (printdump == JNI_TRUE) { + printf(">>> [%s] got final notification from test thread ...\n", thread_name); + } + + err = jvmti->RawMonitorExit(wait_lock); + if (err != JVMTI_ERROR_NONE) { + printf("(RawMonitorExit#wait) unexpected error: %s (%d)\n", + TranslateError(err), err); + return STATUS_FAILED; + } + + if (printdump == JNI_TRUE) { printf(">>> [%s] all done\n", thread_name); } return result; }
< prev index next >