From 491540d91710d49501d09e99b21ea08a8034942f Mon Sep 17 00:00:00 2001 From: sspitsyn Date: Tue, 3 Dec 2013 15:41:35 -0800 Subject: [PATCH] 8028126: nsk/jvmti/scenarios/hotswap/HS101/hs101t006 Crashed the vm on Solaris-sparc64 fastdebug builds: only current thread can flush its registers Summary: Fix a race between VMOp_GetCurrentLocation reaching a safepoint and arget thread exiting from Java execution Reviewed-by: sla, dholmes, dsamersoff Contributed-by: serguei.spitsyn@oracle.com --- src/share/vm/prims/jvmtiEnvThreadState.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/share/vm/prims/jvmtiEnvThreadState.cpp b/src/share/vm/prims/jvmtiEnvThreadState.cpp index 0f0eed6ad..5bdec52d9 100644 --- a/src/share/vm/prims/jvmtiEnvThreadState.cpp +++ b/src/share/vm/prims/jvmtiEnvThreadState.cpp @@ -269,11 +269,20 @@ class VM_GetCurrentLocation : public VM_Operation { void doit() { ResourceMark rmark; // _thread != Thread::current() RegisterMap rm(_thread, false); - javaVFrame* vf = _thread->last_java_vframe(&rm); - assert(vf != NULL, "must have last java frame"); - Method* method = vf->method(); - _method_id = method->jmethod_id(); - _bci = vf->bci(); + // There can be a race condition between a VM_Operation reaching a safepoint + // and the target thread exiting from Java execution. + // We must recheck the last Java frame still exists. + if (_thread->has_last_Java_frame()) { + javaVFrame* vf = _thread->last_java_vframe(&rm); + assert(vf != NULL, "must have last java frame"); + Method* method = vf->method(); + _method_id = method->jmethod_id(); + _bci = vf->bci(); + } else { + // Clear current location as the target thread has no Java frames anymore. + _method_id = (jmethodID)NULL; + _bci = 0; + } } void get_current_location(jmethodID *method_id, int *bci) { *method_id = _method_id; -- GitLab