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