On Thu, 24 Feb 2022 12:44:18 GMT, Alex Menkov <amen...@openjdk.org> wrote:
> The fix adds workaround in hs201t001a class like we have in hs201t001 test to > avoid class loading while the test do single stepping/pop frame. > Also fixed a number of issues in the test. test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t002/TestDescription.java line 74: > 72: * > 73: * @run main/othervm/native > 74: * -agentlib:hs201t002=pathToNewByteCode=./bin,-waittime=5,-verbose Adds verbose output for the test and agent test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t002/hs201t002.cpp line 48: > 46: > 47: static jint testStep; > 48: static int redefineNumber; not used test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t002/hs201t002.cpp line 127: > 125: nsk_jvmti_setFailStatus(); > 126: } > 127: if (!NSK_JVMTI_VERIFY(jvmti_env->Deallocate(newClassBytes))) { proper resource deallocation test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t002/hs201t002.cpp line 334: > 332: jclass klass; > 333: > 334: NSK_DISPLAY2("\n\n>>>> Exception %s in thread - %s\n", getClassName() and getThreadName() used the same global buffer to return results. So thread name overrides class name and in log we see: >>>> Exception hs201t002Thread in thread - hs201t002Thread instead of >>>> Exception Lnsk/jvmti/scenarios/hotswap/HS201/hs201t002a; in thread - >>>> hs201t002Thread test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t002/hs201t002.cpp line 382: > 380: /* > ============================================================================= > */ > 381: > 382: int readNewBytecode(jvmtiEnv* jvmti, jint &newClassSize, unsigned char* > &newClassBytes) { The function returns loaded data instead of using global variable for correct resource management test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t002/hs201t002.cpp line 429: > 427: /* > ============================================================================= > */ > 428: > 429: const char* getThreadName(jvmtiEnv* jvmti_env, JNIEnv* jni_env, jthread > thread) { The function now returns JVMTI allocated buffer instead of global buffer test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t002/hs201t002.cpp line 468: > 466: /* > ============================================================================= > */ > 467: > 468: const char* getClassName(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jobject > object) { The function now returns JVMTI allocated buffer instead of global buffer test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t002/hs201t002.cpp line 668: > 666: NSK_DISPLAY0("Enable events\n"); > 667: > 668: enableEvent(jvmti, JVMTI_EVENT_CLASS_LOAD, testedThread); This code executed on agent initialization, the test has no chance to set testThread. Moved to hs201t002.setThread() test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t002/newclass/hs201t002a.java line 29: > 27: > 28: public hs201t002a () { > 29: System.out.println("Current step: " + hs201t002.currentStep); // > Avoid calling classloader to find hs201t002 in doInit() This is the fix for the failure, the rest are test improvements ------------- PR: https://git.openjdk.java.net/jdk/pull/7607