# HG changeset patch # User dtitov # Date 1554931291 0 # Node ID 1bbce3048d20e5f86cb9e62fab2b9c4b8d5c4465 # Parent 17b1c2c467adda135edc4d9aed0112cc718a66b8 8222224: vmTestbase/nsk/jvmti/SingleStep/singlestep001/TestDescription.java fails Reviewed-by: sspitsyn, jcbeyler, amenkov diff -r 17b1c2c467ad -r 1bbce3048d20 test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep001/singlestep001.cpp --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep001/singlestep001.cpp Wed Apr 10 17:15:53 2019 -0400 +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep001/singlestep001.cpp Wed Apr 10 21:21:31 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -57,7 +57,7 @@ static jvmtiEnv *jvmti = NULL; static jvmtiEventCallbacks callbacks; -static int vm_started = 0; +static volatile int callbacksEnabled = NSK_FALSE; static jrawMonitorID agent_lock; static void setBP(jvmtiEnv *jvmti_env, JNIEnv *env, jclass klass) { @@ -77,7 +77,7 @@ jvmti->RawMonitorEnter(agent_lock); - if (vm_started) { + if (callbacksEnabled) { if (!NSK_JVMTI_VERIFY(jvmti_env->GetClassSignature(klass, &sig, &generic))) env->FatalError("failed to obtain a class signature\n"); @@ -99,6 +99,13 @@ jclass klass; char *sig, *generic; + jvmti->RawMonitorEnter(agent_lock); + + if (!callbacksEnabled) { + jvmti->RawMonitorExit(agent_lock); + return; + } + NSK_DISPLAY0("Breakpoint event received\n"); if (!NSK_JVMTI_VERIFY(jvmti_env->GetMethodDeclaringClass(method, &klass))) NSK_COMPLAIN0("TEST FAILURE: unable to get method declaring class\n\n"); @@ -118,6 +125,7 @@ NSK_COMPLAIN1("TEST FAILURE: unexpected breakpoint event in method of class \"%s\"\n\n", sig); } + jvmti->RawMonitorExit(agent_lock); } void JNICALL @@ -197,7 +205,16 @@ VMStart(jvmtiEnv *jvmti_env, JNIEnv* jni_env) { jvmti->RawMonitorEnter(agent_lock); - vm_started = 1; + callbacksEnabled = NSK_TRUE; + + jvmti->RawMonitorExit(agent_lock); +} + +void JNICALL +VMDeath(jvmtiEnv *jvmti_env, JNIEnv* jni_env) { + jvmti->RawMonitorEnter(agent_lock); + + callbacksEnabled = NSK_FALSE; jvmti->RawMonitorExit(agent_lock); } @@ -261,12 +278,15 @@ callbacks.Breakpoint = &Breakpoint; callbacks.SingleStep = &SingleStep; callbacks.VMStart = &VMStart; + callbacks.VMDeath = &VMDeath; if (!NSK_JVMTI_VERIFY(jvmti->SetEventCallbacks(&callbacks, sizeof(callbacks)))) return JNI_ERR; NSK_DISPLAY0("setting event callbacks done\nenabling JVMTI events ...\n"); if (!NSK_JVMTI_VERIFY(jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_START, NULL))) return JNI_ERR; + if (!NSK_JVMTI_VERIFY(jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL))) + return JNI_ERR; if (!NSK_JVMTI_VERIFY(jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_LOAD, NULL))) return JNI_ERR; if (!NSK_JVMTI_VERIFY(jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_BREAKPOINT, NULL)))