# HG changeset patch # User prr # Date 1538073585 25200 # Node ID afb3c0884bf1d32a520b062b5687249f24a54512 # Parent d3e0d57cd3ffc1fb7130122818874c9857fc5546# Parent 760ca4ba79ced8a163a02ef57367e70beae50cee Merge diff -r d3e0d57cd3ff -r afb3c0884bf1 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 10:49:10 2018 -0700 +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t003/hs203t003.cpp Thu Sep 27 11:39:45 2018 -0700 @@ -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 d3e0d57cd3ff -r afb3c0884bf1 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 10:49:10 2018 -0700 +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t003/hs203t003.java Thu Sep 27 11:39:45 2018 -0700 @@ -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) {