245 return insert_record_after(&tmp); 246 } else { 247 MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz); 248 return insert_record_after(&tmp); 249 } 250 } 251 } 252 cur = (VMMemRegion*)next(); 253 } 254 255 // we may not find committed record due to duplicated records 256 return true; 257 } 258 259 bool VMMemPointerIterator::remove_released_region(MemPointerRecord* rec) { 260 assert(rec->is_deallocation_record(), "Sanity check"); 261 VMMemRegion* cur = (VMMemRegion*)current(); 262 assert(cur->is_reserved_region() && cur->contains_region(rec), 263 "Sanity check"); 264 if (rec->is_same_region(cur)) { 265 // release whole reserved region 266 #ifdef ASSERT 267 VMMemRegion* next_region = (VMMemRegion*)peek_next(); 268 // should not have any committed memory in this reserved region 269 assert(next_region == NULL || !next_region->is_committed_region(), "Sanity check"); 270 #endif 271 remove(); 272 } else if (rec->addr() == cur->addr() || 273 rec->addr() + rec->size() == cur->addr() + cur->size()) { 274 // released region is at either end of this region 275 cur->exclude_region(rec->addr(), rec->size()); 276 assert(check_reserved_region(), "Integrity check"); 277 } else { // split the reserved region and release the middle 278 address high_addr = cur->addr() + cur->size(); 279 size_t sz = high_addr - rec->addr(); 280 cur->exclude_region(rec->addr(), sz); 281 sz = high_addr - rec->addr() - rec->size(); 282 if (MemTracker::track_callsite()) { 283 MemPointerRecordEx tmp(rec->addr() + rec->size(), cur->flags(), sz, 284 ((VMMemRegionEx*)cur)->pc()); 285 bool ret = insert_reserved_region(&tmp); 286 assert(!ret || check_reserved_region(), "Integrity check"); 287 return ret; 288 } else { 289 MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz); 290 bool ret = insert_reserved_region(&tmp); 291 assert(!ret || check_reserved_region(), "Integrity check"); | 245 return insert_record_after(&tmp); 246 } else { 247 MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz); 248 return insert_record_after(&tmp); 249 } 250 } 251 } 252 cur = (VMMemRegion*)next(); 253 } 254 255 // we may not find committed record due to duplicated records 256 return true; 257 } 258 259 bool VMMemPointerIterator::remove_released_region(MemPointerRecord* rec) { 260 assert(rec->is_deallocation_record(), "Sanity check"); 261 VMMemRegion* cur = (VMMemRegion*)current(); 262 assert(cur->is_reserved_region() && cur->contains_region(rec), 263 "Sanity check"); 264 if (rec->is_same_region(cur)) { 265 // release whole reserved region and all committed regions within the reserved region 266 #ifdef ASSERT 267 address low_addr = cur->addr(); 268 address high_addr = low_addr + cur->size(); 269 #endif 270 remove(); 271 // remove committed regions within the reserved region 272 VMMemRegion* next_region = (VMMemRegion*)current(); 273 while (next_region != NULL && next_region->is_committed_region()) { 274 assert(next_region->addr() >= low_addr && 275 next_region->addr() + next_region->size() <= high_addr, 276 "Range check"); 277 remove(); 278 next_region = (VMMemRegion*)current(); 279 } 280 } else if (rec->addr() == cur->addr() || 281 rec->addr() + rec->size() == cur->addr() + cur->size()) { 282 // released region is at either end of this region 283 cur->exclude_region(rec->addr(), rec->size()); 284 assert(check_reserved_region(), "Integrity check"); 285 } else { // split the reserved region and release the middle 286 address high_addr = cur->addr() + cur->size(); 287 size_t sz = high_addr - rec->addr(); 288 cur->exclude_region(rec->addr(), sz); 289 sz = high_addr - rec->addr() - rec->size(); 290 if (MemTracker::track_callsite()) { 291 MemPointerRecordEx tmp(rec->addr() + rec->size(), cur->flags(), sz, 292 ((VMMemRegionEx*)cur)->pc()); 293 bool ret = insert_reserved_region(&tmp); 294 assert(!ret || check_reserved_region(), "Integrity check"); 295 return ret; 296 } else { 297 MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz); 298 bool ret = insert_reserved_region(&tmp); 299 assert(!ret || check_reserved_region(), "Integrity check"); |