comparison src/share/vm/prims/jvmtiEnvThreadState.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 3bee68af0296
children 92aa6797d639
comparison
equal deleted inserted replaced
14652:ef7328717719 14653:0d8d78c0329a
188 _single_stepping_posted = false; 188 _single_stepping_posted = false;
189 } 189 }
190 190
191 191
192 JvmtiFramePops* JvmtiEnvThreadState::get_frame_pops() { 192 JvmtiFramePops* JvmtiEnvThreadState::get_frame_pops() {
193 #ifdef ASSERT 193 assert(get_thread() == Thread::current() || SafepointSynchronize::is_at_safepoint(),
194 uint32_t debug_bits = 0; 194 "frame pop data only accessible from same thread or at safepoint");
195 #endif
196 assert(get_thread() == Thread::current() || JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
197 "frame pop data only accessible from same thread or while suspended");
198
199 if (_frame_pops == NULL) { 195 if (_frame_pops == NULL) {
200 _frame_pops = new JvmtiFramePops(); 196 _frame_pops = new JvmtiFramePops();
201 assert(_frame_pops != NULL, "_frame_pops != NULL"); 197 assert(_frame_pops != NULL, "_frame_pops != NULL");
202 } 198 }
203 return _frame_pops; 199 return _frame_pops;
207 bool JvmtiEnvThreadState::has_frame_pops() { 203 bool JvmtiEnvThreadState::has_frame_pops() {
208 return _frame_pops == NULL? false : (_frame_pops->length() > 0); 204 return _frame_pops == NULL? false : (_frame_pops->length() > 0);
209 } 205 }
210 206
211 void JvmtiEnvThreadState::set_frame_pop(int frame_number) { 207 void JvmtiEnvThreadState::set_frame_pop(int frame_number) {
212 #ifdef ASSERT 208 assert(get_thread() == Thread::current() || SafepointSynchronize::is_at_safepoint(),
213 uint32_t debug_bits = 0; 209 "frame pop data only accessible from same thread or at safepoint");
214 #endif
215 assert(get_thread() == Thread::current() || JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
216 "frame pop data only accessible from same thread or while suspended");
217 JvmtiFramePop fpop(frame_number); 210 JvmtiFramePop fpop(frame_number);
218 JvmtiEventController::set_frame_pop(this, fpop); 211 JvmtiEventController::set_frame_pop(this, fpop);
219 } 212 }
220 213
221 214
222 void JvmtiEnvThreadState::clear_frame_pop(int frame_number) { 215 void JvmtiEnvThreadState::clear_frame_pop(int frame_number) {
223 #ifdef ASSERT 216 assert(get_thread() == Thread::current() || SafepointSynchronize::is_at_safepoint(),
224 uint32_t debug_bits = 0; 217 "frame pop data only accessible from same thread or at safepoint");
225 #endif
226 assert(get_thread() == Thread::current() || JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
227 "frame pop data only accessible from same thread or while suspended");
228 JvmtiFramePop fpop(frame_number); 218 JvmtiFramePop fpop(frame_number);
229 JvmtiEventController::clear_frame_pop(this, fpop); 219 JvmtiEventController::clear_frame_pop(this, fpop);
230 } 220 }
231 221
232 222
233 void JvmtiEnvThreadState::clear_to_frame_pop(int frame_number) { 223 void JvmtiEnvThreadState::clear_to_frame_pop(int frame_number) {
234 #ifdef ASSERT 224 assert(get_thread() == Thread::current() || SafepointSynchronize::is_at_safepoint(),
235 uint32_t debug_bits = 0; 225 "frame pop data only accessible from same thread or at safepoint");
236 #endif
237 assert(get_thread() == Thread::current() || JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
238 "frame pop data only accessible from same thread or while suspended");
239 JvmtiFramePop fpop(frame_number); 226 JvmtiFramePop fpop(frame_number);
240 JvmtiEventController::clear_to_frame_pop(this, fpop); 227 JvmtiEventController::clear_to_frame_pop(this, fpop);
241 } 228 }
242 229
243 230
244 bool JvmtiEnvThreadState::is_frame_pop(int cur_frame_number) { 231 bool JvmtiEnvThreadState::is_frame_pop(int cur_frame_number) {
245 #ifdef ASSERT 232 assert(get_thread() == Thread::current() || SafepointSynchronize::is_at_safepoint(),
246 uint32_t debug_bits = 0; 233 "frame pop data only accessible from same thread or at safepoint");
247 #endif
248 assert(get_thread() == Thread::current() || JvmtiEnv::is_thread_fully_suspended(get_thread(), false, &debug_bits),
249 "frame pop data only accessible from same thread or while suspended");
250 if (!get_thread()->is_interp_only_mode() || _frame_pops == NULL) { 234 if (!get_thread()->is_interp_only_mode() || _frame_pops == NULL) {
251 return false; 235 return false;
252 } 236 }
253 JvmtiFramePop fp(cur_frame_number); 237 JvmtiFramePop fp(cur_frame_number);
254 return get_frame_pops()->contains(fp); 238 return get_frame_pops()->contains(fp);