Mercurial > hg > truffle
comparison src/share/vm/prims/jvmtiEnv.cpp @ 14321:e4062d6c5f22
8032223: nsk/regression/b4663146 gets assert(SafepointSynchronize::is_at_safepoint() || JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits))
Summary: It is better to calculate frame count for suspended threads at a safepoint
Reviewed-by: twisti, dsamersoff, sla, dholmes, dcubed
Contributed-by: serguei.spitsyn@oracle.com
author | sspitsyn |
---|---|
date | Tue, 04 Feb 2014 19:41:46 -0800 |
parents | b8860472c377 |
children | 402677ca28ed |
comparison
equal
deleted
inserted
replaced
14320:602e80a36dfb | 14321:e4062d6c5f22 |
---|---|
1358 // retrieve or create JvmtiThreadState. | 1358 // retrieve or create JvmtiThreadState. |
1359 JvmtiThreadState* state = JvmtiThreadState::state_for(java_thread); | 1359 JvmtiThreadState* state = JvmtiThreadState::state_for(java_thread); |
1360 if (state == NULL) { | 1360 if (state == NULL) { |
1361 return JVMTI_ERROR_THREAD_NOT_ALIVE; | 1361 return JVMTI_ERROR_THREAD_NOT_ALIVE; |
1362 } | 1362 } |
1363 uint32_t debug_bits = 0; | 1363 |
1364 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) { | 1364 // It is only safe to perform the direct operation on the current |
1365 // thread. All other usage needs to use a vm-safepoint-op for safety. | |
1366 if (java_thread == JavaThread::current()) { | |
1365 err = get_frame_count(state, count_ptr); | 1367 err = get_frame_count(state, count_ptr); |
1366 } else { | 1368 } else { |
1367 // get java stack frame count at safepoint. | 1369 // get java stack frame count at safepoint. |
1368 VM_GetFrameCount op(this, state, count_ptr); | 1370 VM_GetFrameCount op(this, state, count_ptr); |
1369 VMThread::execute(&op); | 1371 VMThread::execute(&op); |
1474 // method_ptr - pre-checked for NULL | 1476 // method_ptr - pre-checked for NULL |
1475 // location_ptr - pre-checked for NULL | 1477 // location_ptr - pre-checked for NULL |
1476 jvmtiError | 1478 jvmtiError |
1477 JvmtiEnv::GetFrameLocation(JavaThread* java_thread, jint depth, jmethodID* method_ptr, jlocation* location_ptr) { | 1479 JvmtiEnv::GetFrameLocation(JavaThread* java_thread, jint depth, jmethodID* method_ptr, jlocation* location_ptr) { |
1478 jvmtiError err = JVMTI_ERROR_NONE; | 1480 jvmtiError err = JVMTI_ERROR_NONE; |
1479 uint32_t debug_bits = 0; | 1481 |
1480 | 1482 // It is only safe to perform the direct operation on the current |
1481 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) { | 1483 // thread. All other usage needs to use a vm-safepoint-op for safety. |
1484 if (java_thread == JavaThread::current()) { | |
1482 err = get_frame_location(java_thread, depth, method_ptr, location_ptr); | 1485 err = get_frame_location(java_thread, depth, method_ptr, location_ptr); |
1483 } else { | 1486 } else { |
1484 // JVMTI get java stack frame location at safepoint. | 1487 // JVMTI get java stack frame location at safepoint. |
1485 VM_GetFrameLocation op(this, java_thread, depth, method_ptr, location_ptr); | 1488 VM_GetFrameLocation op(this, java_thread, depth, method_ptr, location_ptr); |
1486 VMThread::execute(&op); | 1489 VMThread::execute(&op); |