On Thu, 24 Feb 2022 12:44:18 GMT, Alex Menkov <[email protected]> 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