comparison src/share/vm/prims/jvmtiEnv.cpp @ 14381:402677ca28ed

8034249: need more workarounds for suspend equivalent condition issue Summary: Collect data at safepoint, do not rely on thread suspension Reviewed-by: dcubed, dholmes Contributed-by: serguei.spitsyn@oracle.com
author sspitsyn
date Tue, 18 Feb 2014 06:19:49 -0800
parents e4062d6c5f22
children d8041d695d19 0d8d78c0329a
comparison
equal deleted inserted replaced
14380:e6195383bcaf 14381:402677ca28ed
1 /* 1 /*
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
997 997
998 // growable array of jvmti monitors info on the C-heap 998 // growable array of jvmti monitors info on the C-heap
999 GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list = 999 GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list =
1000 new (ResourceObj::C_HEAP, mtInternal) GrowableArray<jvmtiMonitorStackDepthInfo*>(1, true); 1000 new (ResourceObj::C_HEAP, mtInternal) GrowableArray<jvmtiMonitorStackDepthInfo*>(1, true);
1001 1001
1002 uint32_t debug_bits = 0; 1002 // It is only safe to perform the direct operation on the current
1003 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) { 1003 // thread. All other usage needs to use a vm-safepoint-op for safety.
1004 if (java_thread == calling_thread) {
1004 err = get_owned_monitors(calling_thread, java_thread, owned_monitors_list); 1005 err = get_owned_monitors(calling_thread, java_thread, owned_monitors_list);
1005 } else { 1006 } else {
1006 // JVMTI get monitors info at safepoint. Do not require target thread to 1007 // JVMTI get monitors info at safepoint. Do not require target thread to
1007 // be suspended. 1008 // be suspended.
1008 VM_GetOwnedMonitorInfo op(this, calling_thread, java_thread, owned_monitors_list); 1009 VM_GetOwnedMonitorInfo op(this, calling_thread, java_thread, owned_monitors_list);
1042 1043
1043 // growable array of jvmti monitors info on the C-heap 1044 // growable array of jvmti monitors info on the C-heap
1044 GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list = 1045 GrowableArray<jvmtiMonitorStackDepthInfo*> *owned_monitors_list =
1045 new (ResourceObj::C_HEAP, mtInternal) GrowableArray<jvmtiMonitorStackDepthInfo*>(1, true); 1046 new (ResourceObj::C_HEAP, mtInternal) GrowableArray<jvmtiMonitorStackDepthInfo*>(1, true);
1046 1047
1047 uint32_t debug_bits = 0; 1048 // It is only safe to perform the direct operation on the current
1048 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) { 1049 // thread. All other usage needs to use a vm-safepoint-op for safety.
1050 if (java_thread == calling_thread) {
1049 err = get_owned_monitors(calling_thread, java_thread, owned_monitors_list); 1051 err = get_owned_monitors(calling_thread, java_thread, owned_monitors_list);
1050 } else { 1052 } else {
1051 // JVMTI get owned monitors info at safepoint. Do not require target thread to 1053 // JVMTI get owned monitors info at safepoint. Do not require target thread to
1052 // be suspended. 1054 // be suspended.
1053 VM_GetOwnedMonitorInfo op(this, calling_thread, java_thread, owned_monitors_list); 1055 VM_GetOwnedMonitorInfo op(this, calling_thread, java_thread, owned_monitors_list);
1084 // java_thread - pre-checked 1086 // java_thread - pre-checked
1085 // monitor_ptr - pre-checked for NULL 1087 // monitor_ptr - pre-checked for NULL
1086 jvmtiError 1088 jvmtiError
1087 JvmtiEnv::GetCurrentContendedMonitor(JavaThread* java_thread, jobject* monitor_ptr) { 1089 JvmtiEnv::GetCurrentContendedMonitor(JavaThread* java_thread, jobject* monitor_ptr) {
1088 jvmtiError err = JVMTI_ERROR_NONE; 1090 jvmtiError err = JVMTI_ERROR_NONE;
1089 uint32_t debug_bits = 0;
1090 JavaThread* calling_thread = JavaThread::current(); 1091 JavaThread* calling_thread = JavaThread::current();
1091 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) { 1092
1093 // It is only safe to perform the direct operation on the current
1094 // thread. All other usage needs to use a vm-safepoint-op for safety.
1095 if (java_thread == calling_thread) {
1092 err = get_current_contended_monitor(calling_thread, java_thread, monitor_ptr); 1096 err = get_current_contended_monitor(calling_thread, java_thread, monitor_ptr);
1093 } else { 1097 } else {
1094 // get contended monitor information at safepoint. 1098 // get contended monitor information at safepoint.
1095 VM_GetCurrentContendedMonitor op(this, calling_thread, java_thread, monitor_ptr); 1099 VM_GetCurrentContendedMonitor op(this, calling_thread, java_thread, monitor_ptr);
1096 VMThread::execute(&op); 1100 VMThread::execute(&op);
1295 // frame_buffer - pre-checked for NULL 1299 // frame_buffer - pre-checked for NULL
1296 // count_ptr - pre-checked for NULL 1300 // count_ptr - pre-checked for NULL
1297 jvmtiError 1301 jvmtiError
1298 JvmtiEnv::GetStackTrace(JavaThread* java_thread, jint start_depth, jint max_frame_count, jvmtiFrameInfo* frame_buffer, jint* count_ptr) { 1302 JvmtiEnv::GetStackTrace(JavaThread* java_thread, jint start_depth, jint max_frame_count, jvmtiFrameInfo* frame_buffer, jint* count_ptr) {
1299 jvmtiError err = JVMTI_ERROR_NONE; 1303 jvmtiError err = JVMTI_ERROR_NONE;
1300 uint32_t debug_bits = 0; 1304
1301 if (is_thread_fully_suspended(java_thread, true, &debug_bits)) { 1305 // It is only safe to perform the direct operation on the current
1306 // thread. All other usage needs to use a vm-safepoint-op for safety.
1307 if (java_thread == JavaThread::current()) {
1302 err = get_stack_trace(java_thread, start_depth, max_frame_count, frame_buffer, count_ptr); 1308 err = get_stack_trace(java_thread, start_depth, max_frame_count, frame_buffer, count_ptr);
1303 } else { 1309 } else {
1304 // JVMTI get stack trace at safepoint. Do not require target thread to 1310 // JVMTI get stack trace at safepoint. Do not require target thread to
1305 // be suspended. 1311 // be suspended.
1306 VM_GetStackTrace op(this, java_thread, start_depth, max_frame_count, frame_buffer, count_ptr); 1312 VM_GetStackTrace op(this, java_thread, start_depth, max_frame_count, frame_buffer, count_ptr);