Mercurial > hg > truffle
comparison src/share/vm/services/memReporter.cpp @ 11052:8cff1de240de
8017478: Kitchensink crashed with SIGSEGV in BaselineReporter::diff_callsites
Summary: Fixed possible NULL pointer that caused SIGSEGV
Reviewed-by: coleenp, acorn, ctornqvi
author | zgu |
---|---|
date | Tue, 25 Jun 2013 17:22:04 -0400 |
parents | cd2118b62475 |
children | de6a9e811145 |
comparison
equal
deleted
inserted
replaced
11033:d9eed26d638a | 11052:8cff1de240de |
---|---|
186 (MallocCallsitePointer*)cur_malloc_itr.current(); | 186 (MallocCallsitePointer*)cur_malloc_itr.current(); |
187 MallocCallsitePointer* prev_malloc_callsite = | 187 MallocCallsitePointer* prev_malloc_callsite = |
188 (MallocCallsitePointer*)prev_malloc_itr.current(); | 188 (MallocCallsitePointer*)prev_malloc_itr.current(); |
189 | 189 |
190 while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) { | 190 while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) { |
191 if (prev_malloc_callsite == NULL || | 191 if (prev_malloc_callsite == NULL) { |
192 cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) { | 192 assert(cur_malloc_callsite != NULL, "sanity check"); |
193 // this is a new callsite | 193 // this is a new callsite |
194 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), | 194 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), |
195 amount_in_current_scale(cur_malloc_callsite->amount()), | 195 amount_in_current_scale(cur_malloc_callsite->amount()), |
196 cur_malloc_callsite->count(), | 196 cur_malloc_callsite->count(), |
197 diff_in_current_scale(cur_malloc_callsite->amount(), 0), | 197 diff_in_current_scale(cur_malloc_callsite->amount(), 0), |
198 diff(cur_malloc_callsite->count(), 0)); | 198 diff(cur_malloc_callsite->count(), 0)); |
199 cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); | 199 cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); |
200 } else if (cur_malloc_callsite == NULL || | 200 } else if (cur_malloc_callsite == NULL) { |
201 cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) { | 201 assert(prev_malloc_callsite != NULL, "Sanity check"); |
202 // this callsite is already gone | 202 // this callsite is already gone |
203 _outputer.diff_malloc_callsite(prev_malloc_callsite->addr(), | 203 _outputer.diff_malloc_callsite(prev_malloc_callsite->addr(), |
204 amount_in_current_scale(0), 0, | 204 0, 0, |
205 diff_in_current_scale(0, prev_malloc_callsite->amount()), | 205 diff_in_current_scale(0, prev_malloc_callsite->amount()), |
206 diff(0, prev_malloc_callsite->count())); | 206 diff(0, prev_malloc_callsite->count())); |
207 prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); | 207 prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); |
208 } else { // the same callsite | 208 } else { |
209 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), | 209 assert(cur_malloc_callsite != NULL, "Sanity check"); |
210 amount_in_current_scale(cur_malloc_callsite->amount()), | 210 assert(prev_malloc_callsite != NULL, "Sanity check"); |
211 cur_malloc_callsite->count(), | 211 if (cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) { |
212 diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()), | 212 // this is a new callsite |
213 diff(cur_malloc_callsite->count(), prev_malloc_callsite->count())); | 213 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), |
214 cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); | 214 amount_in_current_scale(cur_malloc_callsite->amount()), |
215 prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); | 215 cur_malloc_callsite->count(), |
216 diff_in_current_scale(cur_malloc_callsite->amount(), 0), | |
217 diff(cur_malloc_callsite->count(), 0)); | |
218 cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); | |
219 } else if (cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) { | |
220 // this callsite is already gone | |
221 _outputer.diff_malloc_callsite(prev_malloc_callsite->addr(), | |
222 0, 0, | |
223 diff_in_current_scale(0, prev_malloc_callsite->amount()), | |
224 diff(0, prev_malloc_callsite->count())); | |
225 prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); | |
226 } else { | |
227 // the same callsite | |
228 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), | |
229 amount_in_current_scale(cur_malloc_callsite->amount()), | |
230 cur_malloc_callsite->count(), | |
231 diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()), | |
232 diff(cur_malloc_callsite->count(), prev_malloc_callsite->count())); | |
233 cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); | |
234 prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); | |
235 } | |
216 } | 236 } |
217 } | 237 } |
218 | 238 |
219 // walk virtual memory callsite | 239 // walk virtual memory callsite |
220 MemPointerArrayIteratorImpl cur_vm_itr(pBL_cur->_vm_cs); | 240 MemPointerArrayIteratorImpl cur_vm_itr(pBL_cur->_vm_cs); |