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);
146
147 // Get the size of the object before calling the closure, which
148 // might overwrite the object in case we are relocating in-place.
149 const size_t size = ZUtils::object_size(addr);
150
151 // Apply closure
152 cl->do_object(ZOop::from_address(addr));
153
154 // Find next bit after this object
155 const uintptr_t next_addr = align_up(addr + size, 1 << page_object_alignment_shift);
156 const BitMap::idx_t next_index = ((next_addr - page_start) >> page_object_alignment_shift) * 2;
157 if (next_index >= end_index) {
158 // End of live map
159 break;
160 }
161
162 index = _bitmap.get_next_one_offset(next_index, end_index);
163 }
164 }
165
166 inline void ZLiveMap::iterate(ObjectClosure* cl, uintptr_t page_start, size_t page_object_alignment_shift) {
167 if (is_marked()) {
168 for (BitMap::idx_t segment = first_live_segment(); segment < nsegments; segment = next_live_segment(segment)) {
169 // For each live segment
170 iterate_segment(cl, segment, page_start, page_object_alignment_shift);
171 }
172 }
173 }
174
175 #endif // SHARE_GC_Z_ZLIVEMAP_INLINE_HPP
|
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);
146
147 // Apply closure
148 cl->do_object(ZOop::from_address(addr));
149
150 // Find next bit after this object
151 const uintptr_t next_addr = align_up(addr + 1, 1 << page_object_alignment_shift);
152 const BitMap::idx_t next_index = ((next_addr - page_start) >> page_object_alignment_shift) * 2;
153 if (next_index >= end_index) {
154 // End of live map
155 break;
156 }
157
158 index = _bitmap.get_next_one_offset(next_index, end_index);
159 }
160 }
161
162 inline void ZLiveMap::iterate(ObjectClosure* cl, uintptr_t page_start, size_t page_object_alignment_shift) {
163 if (is_marked()) {
164 for (BitMap::idx_t segment = first_live_segment(); segment < nsegments; segment = next_live_segment(segment)) {
165 // For each live segment
166 iterate_segment(cl, segment, page_start, page_object_alignment_shift);
167 }
168 }
169 }
170
171 #endif // SHARE_GC_Z_ZLIVEMAP_INLINE_HPP
|