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