@@ -173,27 +173,26 @@ ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
173173 // The bitmap routines require the right boundary to be word-aligned.
174174 const idx_t search_end = align_range_end (range_end);
175175
176- idx_t cur_beg = find_obj_beg (range_beg, search_end);
177- while (cur_beg < range_end) {
178- const idx_t cur_end = find_obj_end (cur_beg, search_end);
179- if (cur_end >= range_end) {
180- // The obj ends outside the range.
181- live_closure->set_source (bit_to_addr (cur_beg));
182- return incomplete;
176+ idx_t cur_beg = range_beg;
177+ while (true ) {
178+ cur_beg = find_obj_beg (cur_beg, search_end);
179+ if (cur_beg >= range_end) {
180+ break ;
183181 }
184182
185- const size_t size = obj_size (cur_beg, cur_end );
183+ const size_t size = obj_size (cur_beg);
186184 IterationStatus status = live_closure->do_addr (bit_to_addr (cur_beg), size);
187185 if (status != incomplete) {
188186 assert (status == would_overflow || status == full, " sanity" );
189187 return status;
190188 }
191189
192- // Successfully processed the object; look for the next object.
193- cur_beg = find_obj_beg (cur_end + 1 , search_end);
190+ cur_beg += words_to_bits (size);
191+ if (cur_beg >= range_end) {
192+ break ;
193+ }
194194 }
195195
196- live_closure->set_source (bit_to_addr (range_end));
197196 return complete;
198197}
199198
@@ -210,45 +209,41 @@ ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
210209 assert (range_end <= dead_range_end, " dead range invalid" );
211210
212211 // The bitmap routines require the right boundary to be word-aligned.
213- const idx_t live_search_end = align_range_end (range_end);
214212 const idx_t dead_search_end = align_range_end (dead_range_end);
215213
216214 idx_t cur_beg = range_beg;
217215 if (range_beg < range_end && is_unmarked (range_beg)) {
218216 // The range starts with dead space. Look for the next object, then fill.
217+ // This must be the beginning of old/eden/from/to-space, so it's must be
218+ // large enough for a filler.
219219 cur_beg = find_obj_beg (range_beg + 1 , dead_search_end);
220- const idx_t dead_space_end = MIN2 ( cur_beg - 1 , dead_range_end - 1 ) ;
220+ const idx_t dead_space_end = cur_beg - 1 ;
221221 const size_t size = obj_size (range_beg, dead_space_end);
222222 dead_closure->do_addr (bit_to_addr (range_beg), size);
223223 }
224224
225225 while (cur_beg < range_end) {
226- const idx_t cur_end = find_obj_end (cur_beg, live_search_end);
227- if (cur_end >= range_end) {
228- // The obj ends outside the range.
229- live_closure->set_source (bit_to_addr (cur_beg));
230- return incomplete;
231- }
232-
233- const size_t size = obj_size (cur_beg, cur_end);
226+ const size_t size = obj_size (cur_beg);
234227 IterationStatus status = live_closure->do_addr (bit_to_addr (cur_beg), size);
235228 if (status != incomplete) {
236229 assert (status == would_overflow || status == full, " sanity" );
237230 return status;
238231 }
239232
233+ const idx_t dead_space_beg = cur_beg + words_to_bits (size);
234+ if (dead_space_beg >= dead_search_end) {
235+ break ;
236+ }
240237 // Look for the start of the next object.
241- const idx_t dead_space_beg = cur_end + 1 ;
242238 cur_beg = find_obj_beg (dead_space_beg, dead_search_end);
243239 if (cur_beg > dead_space_beg) {
244240 // Found dead space; compute the size and invoke the dead closure.
245- const idx_t dead_space_end = MIN2 ( cur_beg - 1 , dead_range_end - 1 ) ;
246- const size_t size = obj_size ( dead_space_beg, dead_space_end);
247- dead_closure-> do_addr ( bit_to_addr ( dead_space_beg), size );
241+ const idx_t dead_space_end = cur_beg - 1 ;
242+ dead_closure-> do_addr ( bit_to_addr ( dead_space_beg),
243+ obj_size ( dead_space_beg, dead_space_end) );
248244 }
249245 }
250246
251- live_closure->set_source (bit_to_addr (range_end));
252247 return complete;
253248}
254249
0 commit comments