comparison src/share/vm/prims/jvmtiThreadState.cpp @ 14653:0d8d78c0329a

6471769: Error: assert(_cur_stack_depth == count_frames(),"cur_stack_depth out of sync") Summary: It is more safe to get/update data for suspended threads at a safepoint Reviewed-by: dcubed, twisti, dholmes Contributed-by: serguei.spitsyn@oracle.com
author sspitsyn
date Sat, 01 Mar 2014 08:05:55 -0800
parents da91efe96a93
children 92aa6797d639
comparison
equal deleted inserted replaced
14652:ef7328717719 14653:0d8d78c0329a
1 /* 1 /*
2 * Copyright (c) 2003, 2012, 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.
61 _head_env_thread_state = NULL; 61 _head_env_thread_state = NULL;
62 _dynamic_code_event_collector = NULL; 62 _dynamic_code_event_collector = NULL;
63 _vm_object_alloc_event_collector = NULL; 63 _vm_object_alloc_event_collector = NULL;
64 _the_class_for_redefinition_verification = NULL; 64 _the_class_for_redefinition_verification = NULL;
65 _scratch_class_for_redefinition_verification = NULL; 65 _scratch_class_for_redefinition_verification = NULL;
66 _cur_stack_depth = UNKNOWN_STACK_DEPTH;
66 67
67 // JVMTI ForceEarlyReturn support 68 // JVMTI ForceEarlyReturn support
68 _pending_step_for_earlyret = false; 69 _pending_step_for_earlyret = false;
69 _earlyret_state = earlyret_inactive; 70 _earlyret_state = earlyret_inactive;
70 _earlyret_tos = ilgl; 71 _earlyret_tos = ilgl;
211 } 212 }
212 213
213 214
214 // Helper routine used in several places 215 // Helper routine used in several places
215 int JvmtiThreadState::count_frames() { 216 int JvmtiThreadState::count_frames() {
216 #ifdef ASSERT 217 guarantee(SafepointSynchronize::is_at_safepoint() ||
217 uint32_t debug_bits = 0; 218 (JavaThread *)Thread::current() == get_thread(),
218 #endif 219 "must be current thread or at safepoint");
219 assert(SafepointSynchronize::is_at_safepoint() ||
220 JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
221 "at safepoint or must be suspended");
222 220
223 if (!get_thread()->has_last_Java_frame()) return 0; // no Java frames 221 if (!get_thread()->has_last_Java_frame()) return 0; // no Java frames
224 222
225 ResourceMark rm; 223 ResourceMark rm;
226 RegisterMap reg_map(get_thread()); 224 RegisterMap reg_map(get_thread());
241 return n; 239 return n;
242 } 240 }
243 241
244 242
245 void JvmtiThreadState::invalidate_cur_stack_depth() { 243 void JvmtiThreadState::invalidate_cur_stack_depth() {
246 Thread *cur = Thread::current(); 244 guarantee(SafepointSynchronize::is_at_safepoint() ||
247 uint32_t debug_bits = 0; 245 (JavaThread *)Thread::current() == get_thread(),
248 246 "must be current thread or at safepoint");
249 // The caller can be the VMThread at a safepoint, the current thread
250 // or the target thread must be suspended.
251 guarantee((cur->is_VM_thread() && SafepointSynchronize::is_at_safepoint()) ||
252 (JavaThread *)cur == get_thread() ||
253 JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
254 "sanity check");
255 247
256 _cur_stack_depth = UNKNOWN_STACK_DEPTH; 248 _cur_stack_depth = UNKNOWN_STACK_DEPTH;
257 } 249 }
258 250
259 void JvmtiThreadState::incr_cur_stack_depth() { 251 void JvmtiThreadState::incr_cur_stack_depth() {
278 assert(_cur_stack_depth >= 0, "incr/decr_cur_stack_depth mismatch"); 270 assert(_cur_stack_depth >= 0, "incr/decr_cur_stack_depth mismatch");
279 } 271 }
280 } 272 }
281 273
282 int JvmtiThreadState::cur_stack_depth() { 274 int JvmtiThreadState::cur_stack_depth() {
283 uint32_t debug_bits = 0; 275 guarantee(SafepointSynchronize::is_at_safepoint() ||
284 guarantee(JavaThread::current() == get_thread() || 276 (JavaThread *)Thread::current() == get_thread(),
285 JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits), 277 "must be current thread or at safepoint");
286 "must be current thread or suspended");
287 278
288 if (!is_interp_only_mode() || _cur_stack_depth == UNKNOWN_STACK_DEPTH) { 279 if (!is_interp_only_mode() || _cur_stack_depth == UNKNOWN_STACK_DEPTH) {
289 _cur_stack_depth = count_frames(); 280 _cur_stack_depth = count_frames();
290 } else { 281 } else {
291 // heavy weight assert 282 // heavy weight assert