< prev index next >

src/hotspot/share/gc/z/zLiveMap.inline.hpp

Print this page

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
< prev index next >