104 } 105 106 inline bool ZLiveMap::set(size_t index, bool finalizable, bool& inc_live) { 107 if (!is_marked()) { 108 // First object to be marked during this 109 // cycle, reset marking information. 110 reset(index); 111 } 112 113 const BitMap::idx_t segment = index_to_segment(index); 114 if (!is_segment_live(segment)) { 115 // First object to be marked in this segment during 116 // this cycle, reset segment bitmap. 117 reset_segment(segment); 118 } 119 120 return _bitmap.par_set_bit_pair(index, finalizable, inc_live); 121 } 122 123 inline void ZLiveMap::inc_live(uint32_t objects, size_t bytes) { 124 Atomic::add(objects, &_live_objects); 125 Atomic::add(bytes, &_live_bytes); 126 } 127 128 inline BitMap::idx_t ZLiveMap::segment_start(BitMap::idx_t segment) const { 129 return segment_size() * segment; 130 } 131 132 inline BitMap::idx_t ZLiveMap::segment_end(BitMap::idx_t segment) const { 133 return segment_start(segment) + segment_size(); 134 } 135 136 inline void ZLiveMap::iterate_segment(ObjectClosure* cl, BitMap::idx_t segment, uintptr_t page_start, size_t page_object_alignment_shift) { 137 assert(is_segment_live(segment), "Must be"); 138 139 const BitMap::idx_t start_index = segment_start(segment); 140 const BitMap::idx_t end_index = segment_end(segment); 141 BitMap::idx_t index = _bitmap.get_next_one_offset(start_index, end_index); 142 143 while (index < end_index) { 144 // Calculate object address 145 const uintptr_t addr = page_start + ((index / 2) << page_object_alignment_shift); | 104 } 105 106 inline bool ZLiveMap::set(size_t index, bool finalizable, bool& inc_live) { 107 if (!is_marked()) { 108 // First object to be marked during this 109 // cycle, reset marking information. 110 reset(index); 111 } 112 113 const BitMap::idx_t segment = index_to_segment(index); 114 if (!is_segment_live(segment)) { 115 // First object to be marked in this segment during 116 // this cycle, reset segment bitmap. 117 reset_segment(segment); 118 } 119 120 return _bitmap.par_set_bit_pair(index, finalizable, inc_live); 121 } 122 123 inline void ZLiveMap::inc_live(uint32_t objects, size_t bytes) { 124 Atomic::add(&_live_objects, objects); 125 Atomic::add(&_live_bytes, bytes); 126 } 127 128 inline BitMap::idx_t ZLiveMap::segment_start(BitMap::idx_t segment) const { 129 return segment_size() * segment; 130 } 131 132 inline BitMap::idx_t ZLiveMap::segment_end(BitMap::idx_t segment) const { 133 return segment_start(segment) + segment_size(); 134 } 135 136 inline void ZLiveMap::iterate_segment(ObjectClosure* cl, BitMap::idx_t segment, uintptr_t page_start, size_t page_object_alignment_shift) { 137 assert(is_segment_live(segment), "Must be"); 138 139 const BitMap::idx_t start_index = segment_start(segment); 140 const BitMap::idx_t end_index = segment_end(segment); 141 BitMap::idx_t index = _bitmap.get_next_one_offset(start_index, end_index); 142 143 while (index < end_index) { 144 // Calculate object address 145 const uintptr_t addr = page_start + ((index / 2) << page_object_alignment_shift); |