src/share/vm/prims/jvmtiEnv.cpp
Print this page
@@ -1462,11 +1462,23 @@
// (see call_VM_base() in assembler_<cpu>.cpp).
// It's fine to update the thread state here because no JVMTI events
// shall be posted for this PopFrame.
+ // It is only safe to perform the direct operation on the current
+ // thread. All other usage needs to use a vm-safepoint-op for safety.
+ if (java_thread == JavaThread::current()) {
state->update_for_pop_top_frame();
+ } else {
+ VM_UpdateForPopTopFrame op(state);
+ VMThread::execute(&op);
+ jvmtiError err = op.result();
+ if (err != JVMTI_ERROR_NONE) {
+ return err;
+ }
+ }
+
java_thread->set_popframe_condition(JavaThread::popframe_pending_bit);
// Set pending step flag for this popframe and it is cleared when next
// step event is posted.
state->set_pending_step_for_popframe();
}
@@ -1503,10 +1515,11 @@
// java_thread - pre-checked
// java_thread - unchecked
// depth - pre-checked as non-negative
jvmtiError
JvmtiEnv::NotifyFramePop(JavaThread* java_thread, jint depth) {
+ jvmtiError err = JVMTI_ERROR_NONE;
ResourceMark rm;
uint32_t debug_bits = 0;
JvmtiThreadState *state = JvmtiThreadState::state_for(java_thread);
if (state == NULL) {
@@ -1530,14 +1543,21 @@
return JVMTI_ERROR_OPAQUE_FRAME;
}
assert(vf->frame_pointer() != NULL, "frame pointer mustn't be NULL");
+ // It is only safe to perform the direct operation on the current
+ // thread. All other usage needs to use a vm-safepoint-op for safety.
+ if (java_thread == JavaThread::current()) {
int frame_number = state->count_frames() - depth;
state->env_thread_state(this)->set_frame_pop(frame_number);
-
- return JVMTI_ERROR_NONE;
+ } else {
+ VM_SetFramePop op(this, state, depth);
+ VMThread::execute(&op);
+ err = op.result();
+ }
+ return err;
} /* end NotifyFramePop */
//
// Force Early Return functions