# HG changeset patch # User gadams # Date 1538047993 14400 # Node ID 760ca4ba79ced8a163a02ef57367e70beae50cee # Parent 11fd6c8188d9efd0f1c7e9cd05a36ce3dbbd03a9 8210984: [TESTBUG] hs203t003 fails with "# ERROR: hs203t003.cpp, 218: NSK_CPP_STUB2 ( ResumeThread, jvmti, thread)" Reviewed-by: cjplummer, jcbeyler diff -r 11fd6c8188d9 -r 760ca4ba79ce test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t003/hs203t003.cpp --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t003/hs203t003.cpp Thu Sep 27 08:49:12 2018 -0700 +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t003/hs203t003.cpp Thu Sep 27 07:33:13 2018 -0400 @@ -174,6 +174,23 @@ return JNI_OK; } +JNIEXPORT jboolean JNICALL +Java_nsk_jvmti_scenarios_hotswap_HS203_hs203t003_hs203t003_isSuspended(JNIEnv * jni, + jclass clas, + jthread thread) { + jboolean retvalue; + jint state; + retvalue = JNI_FALSE; + if ( ! NSK_JVMTI_VERIFY( NSK_CPP_STUB3(GetThreadState, jvmti, thread, &state) ) ) { + nsk_printf(" Agent :: Error while getting thread state.\n"); + nsk_jvmti_agentFailed(); + } else { + if ( state & JVMTI_THREAD_STATE_SUSPENDED) { + retvalue = JNI_TRUE; + } + } + return retvalue; +} JNIEXPORT jboolean JNICALL Java_nsk_jvmti_scenarios_hotswap_HS203_hs203t003_hs203t003_popThreadFrame(JNIEnv * jni, diff -r 11fd6c8188d9 -r 760ca4ba79ce test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t003/hs203t003.java --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t003/hs203t003.java Thu Sep 27 08:49:12 2018 -0700 +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t003/hs203t003.java Thu Sep 27 07:33:13 2018 -0400 @@ -62,7 +62,8 @@ public class hs203t003 extends RedefineAgent { public native boolean popThreadFrame(Thread thread); - public native boolean resumeThread(Thread thread); + public native boolean isSuspended(Thread thread); + public native boolean resumeThread(Thread thread); public hs203t003(String[] arg) { @@ -82,10 +83,10 @@ MyThread mt = new MyThread(); try { mt.start(); - // check if we can can pop the thread. - // we can not do redefine/pop frame on run method. + // Check if we can can pop the thread. + // We can not do redefine/pop frame on run method. while (!MyThread.resume.get()); - // sleep for some few secs to get redefined. + // Sleep for some few secs to get redefined. while (!isRedefined()) { if (!agentStatus()) { System.out.println("Failed to redefine class"); @@ -93,10 +94,26 @@ } Thread.sleep(100); } - popThreadFrame(mt); // pop the frame. - resumeThread(mt); // resume the thread. + // Wait for the thread to be suspended. + while (!isSuspended(mt)) { + if (!agentStatus()) { + System.out.println("Failed to suspend thread"); + return passed; + } + Thread.sleep(100); + } + // Pop the frame. + if (!popThreadFrame(mt)) { + System.out.println("Failed to pop a frame = " + + mt.threadState); + } + // Resume the thread. + if(!resumeThread(mt)) { + System.out.println("Failed to resume the thread = " + + mt.threadState); + } + // Wait till the other thread completes its execution. mt.join(); - // wait till the other thread completes its execution. System.out.println("Thread state after popping/redefining = " + mt.threadState); } catch(Exception ie) {