< prev index next >

src/hotspot/share/gc/parallel/psParallelCompact.cpp

Print this page




 504 {
 505   const RegionData* cur_cp = region(region_idx);
 506   const RegionData* const end_cp = region(region_count() - 1);
 507 
 508   HeapWord* result = region_to_addr(region_idx);
 509   if (cur_cp < end_cp) {
 510     do {
 511       result += cur_cp->partial_obj_size();
 512     } while (cur_cp->partial_obj_size() == RegionSize && ++cur_cp < end_cp);
 513   }
 514   return result;
 515 }
 516 
 517 void ParallelCompactData::add_obj(HeapWord* addr, size_t len)
 518 {
 519   const size_t obj_ofs = pointer_delta(addr, _region_start);
 520   const size_t beg_region = obj_ofs >> Log2RegionSize;
 521   const size_t end_region = (obj_ofs + len - 1) >> Log2RegionSize;
 522 
 523   DEBUG_ONLY(Atomic::inc(&add_obj_count);)
 524   DEBUG_ONLY(Atomic::add_ptr(len, &add_obj_size);)
 525 
 526   if (beg_region == end_region) {
 527     // All in one region.
 528     _region_data[beg_region].add_live_obj(len);
 529     return;
 530   }
 531 
 532   // First region.
 533   const size_t beg_ofs = region_offset(addr);
 534   _region_data[beg_region].add_live_obj(RegionSize - beg_ofs);
 535 
 536   Klass* klass = ((oop)addr)->klass();
 537   // Middle regions--completely spanned by this object.
 538   for (size_t region = beg_region + 1; region < end_region; ++region) {
 539     _region_data[region].set_partial_obj_size(RegionSize);
 540     _region_data[region].set_partial_obj_addr(addr);
 541   }
 542 
 543   // Last region.
 544   const size_t end_ofs = region_offset(addr + len - 1);




 504 {
 505   const RegionData* cur_cp = region(region_idx);
 506   const RegionData* const end_cp = region(region_count() - 1);
 507 
 508   HeapWord* result = region_to_addr(region_idx);
 509   if (cur_cp < end_cp) {
 510     do {
 511       result += cur_cp->partial_obj_size();
 512     } while (cur_cp->partial_obj_size() == RegionSize && ++cur_cp < end_cp);
 513   }
 514   return result;
 515 }
 516 
 517 void ParallelCompactData::add_obj(HeapWord* addr, size_t len)
 518 {
 519   const size_t obj_ofs = pointer_delta(addr, _region_start);
 520   const size_t beg_region = obj_ofs >> Log2RegionSize;
 521   const size_t end_region = (obj_ofs + len - 1) >> Log2RegionSize;
 522 
 523   DEBUG_ONLY(Atomic::inc(&add_obj_count);)
 524   DEBUG_ONLY(Atomic::add(len, &add_obj_size);)
 525 
 526   if (beg_region == end_region) {
 527     // All in one region.
 528     _region_data[beg_region].add_live_obj(len);
 529     return;
 530   }
 531 
 532   // First region.
 533   const size_t beg_ofs = region_offset(addr);
 534   _region_data[beg_region].add_live_obj(RegionSize - beg_ofs);
 535 
 536   Klass* klass = ((oop)addr)->klass();
 537   // Middle regions--completely spanned by this object.
 538   for (size_t region = beg_region + 1; region < end_region; ++region) {
 539     _region_data[region].set_partial_obj_size(RegionSize);
 540     _region_data[region].set_partial_obj_addr(addr);
 541   }
 542 
 543   // Last region.
 544   const size_t end_ofs = region_offset(addr + len - 1);


< prev index next >