Mercurial > hg > truffle
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); |