279 |
279 |
280 bool verify_ready_for_par_iteration() { |
280 bool verify_ready_for_par_iteration() { |
281 return (_iter_state == Unclaimed) && (_iter_claimed == 0); |
281 return (_iter_state == Unclaimed) && (_iter_claimed == 0); |
282 } |
282 } |
283 |
283 |
284 // Initialize the given iterator to iterate over this rem set. |
|
285 void init_iterator(HeapRegionRemSetIterator* iter) const; |
|
286 |
|
287 // The actual # of bytes this hr_remset takes up. |
284 // The actual # of bytes this hr_remset takes up. |
288 size_t mem_size() { |
285 size_t mem_size() { |
289 return _other_regions.mem_size() |
286 return _other_regions.mem_size() |
290 // This correction is necessary because the above includes the second |
287 // This correction is necessary because the above includes the second |
291 // part. |
288 // part. |
343 #ifndef PRODUCT |
340 #ifndef PRODUCT |
344 static void test(); |
341 static void test(); |
345 #endif |
342 #endif |
346 }; |
343 }; |
347 |
344 |
348 class HeapRegionRemSetIterator : public CHeapObj<mtGC> { |
345 class HeapRegionRemSetIterator : public StackObj { |
349 |
346 |
350 // The region over which we're iterating. |
347 // The region RSet over which we're iterating. |
351 const HeapRegionRemSet* _hrrs; |
348 const HeapRegionRemSet* _hrrs; |
352 |
349 |
353 // Local caching of HRRS fields. |
350 // Local caching of HRRS fields. |
354 const BitMap* _coarse_map; |
351 const BitMap* _coarse_map; |
355 PerRegionTable** _fine_grain_regions; |
352 PerRegionTable** _fine_grain_regions; |
360 // The number yielded since initialization. |
357 // The number yielded since initialization. |
361 size_t _n_yielded_fine; |
358 size_t _n_yielded_fine; |
362 size_t _n_yielded_coarse; |
359 size_t _n_yielded_coarse; |
363 size_t _n_yielded_sparse; |
360 size_t _n_yielded_sparse; |
364 |
361 |
365 // If true we're iterating over the coarse table; if false the fine |
362 // Indicates what granularity of table that we're currently iterating over. |
366 // table. |
363 // We start iterating over the sparse table, progress to the fine grain |
|
364 // table, and then finish with the coarse table. |
|
365 // See HeapRegionRemSetIterator::has_next(). |
367 enum IterState { |
366 enum IterState { |
368 Sparse, |
367 Sparse, |
369 Fine, |
368 Fine, |
370 Coarse |
369 Coarse |
371 }; |
370 }; |
401 bool fine_has_next(size_t& card_index); |
400 bool fine_has_next(size_t& card_index); |
402 |
401 |
403 public: |
402 public: |
404 // We require an iterator to be initialized before use, so the |
403 // We require an iterator to be initialized before use, so the |
405 // constructor does little. |
404 // constructor does little. |
406 HeapRegionRemSetIterator(); |
405 HeapRegionRemSetIterator(const HeapRegionRemSet* hrrs); |
407 |
|
408 void initialize(const HeapRegionRemSet* hrrs); |
|
409 |
406 |
410 // If there remains one or more cards to be yielded, returns true and |
407 // If there remains one or more cards to be yielded, returns true and |
411 // sets "card_index" to one of those cards (which is then considered |
408 // sets "card_index" to one of those cards (which is then considered |
412 // yielded.) Otherwise, returns false (and leaves "card_index" |
409 // yielded.) Otherwise, returns false (and leaves "card_index" |
413 // undefined.) |
410 // undefined.) |