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);