comparison src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp @ 10182:5c93c1f61226

8011724: G1: Stack allocate instances of HeapRegionRemSetIterator Summary: Stack allocate instances of HeapRegionRemSetIterator during RSet scanning. Reviewed-by: brutisso, jwilhelm
author johnc
date Thu, 18 Apr 2013 10:09:23 -0700
parents db823a892a55
children 6702da6b6082
comparison
equal deleted inserted replaced
10181:1cb4795305b9 10182:5c93c1f61226
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.)