src/share/vm/prims/jvmtiEnvThreadState.cpp

Print this page

        

@@ -219,14 +219,16 @@
 }
 
 
 void JvmtiEnvThreadState::clear_frame_pop(int frame_number) {
 #ifdef ASSERT
+  Thread* cur =  Thread::current();
   uint32_t debug_bits = 0;
 #endif
-  assert(get_thread() == Thread::current() || JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
-         "frame pop data only accessible from same thread or while suspended");
+  assert(get_thread() == cur || (cur->is_VM_thread() && SafepointSynchronize::is_at_safepoint()) ||
+         JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
+         "frame pop data only accessible from same thread, at safepoint or while suspended");
   JvmtiFramePop fpop(frame_number);
   JvmtiEventController::clear_frame_pop(this, fpop);
 }
 
 

@@ -241,14 +243,16 @@
 }
 
 
 bool JvmtiEnvThreadState::is_frame_pop(int cur_frame_number) {
 #ifdef ASSERT
+  Thread* cur =  Thread::current();
   uint32_t debug_bits = 0;
 #endif
-  assert(get_thread() == Thread::current() || JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
-         "frame pop data only accessible from same thread or while suspended");
+  assert(get_thread() == cur || (cur->is_VM_thread() && SafepointSynchronize::is_at_safepoint()) ||
+         JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
+         "frame pop data only accessible from same thread, at safepoint or while suspended");
   if (!get_thread()->is_interp_only_mode() || _frame_pops == NULL) {
     return false;
   }
   JvmtiFramePop fp(cur_frame_number);
   return get_frame_pops()->contains(fp);