Mercurial > hg > truffle
comparison src/share/vm/memory/cardTableModRefBS.cpp @ 3287:c48ad6ab8bdf
7037276: Unnecessary double traversal of dirty card windows
Summary: Short-circuited an unnecessary double traversal of dirty card windows when iterating younger refs. Also renamed some cardtable methods for more clarity.
Reviewed-by: jmasa, stefank, poonam
author | ysr |
---|---|
date | Wed, 20 Apr 2011 19:19:30 -0700 |
parents | c69b1043dfb1 |
children | 063382f9b575 |
comparison
equal
deleted
inserted
replaced
3285:49a67202bc67 | 3287:c48ad6ab8bdf |
---|---|
454 } | 454 } |
455 return true; | 455 return true; |
456 } | 456 } |
457 | 457 |
458 | 458 |
459 void CardTableModRefBS::non_clean_card_iterate(Space* sp, | 459 void CardTableModRefBS::non_clean_card_iterate_possibly_parallel(Space* sp, |
460 MemRegion mr, | 460 MemRegion mr, |
461 DirtyCardToOopClosure* dcto_cl, | 461 DirtyCardToOopClosure* dcto_cl, |
462 MemRegionClosure* cl) { | 462 ClearNoncleanCardWrapper* cl) { |
463 if (!mr.is_empty()) { | 463 if (!mr.is_empty()) { |
464 int n_threads = SharedHeap::heap()->n_par_threads(); | 464 int n_threads = SharedHeap::heap()->n_par_threads(); |
465 if (n_threads > 0) { | 465 if (n_threads > 0) { |
466 #ifndef SERIALGC | 466 #ifndef SERIALGC |
467 par_non_clean_card_iterate_work(sp, mr, dcto_cl, cl, n_threads); | 467 non_clean_card_iterate_parallel_work(sp, mr, dcto_cl, cl, n_threads); |
468 #else // SERIALGC | 468 #else // SERIALGC |
469 fatal("Parallel gc not supported here."); | 469 fatal("Parallel gc not supported here."); |
470 #endif // SERIALGC | 470 #endif // SERIALGC |
471 } else { | 471 } else { |
472 non_clean_card_iterate_work(mr, cl); | 472 // We do not call the non_clean_card_iterate_serial() version below because |
473 } | 473 // we want to clear the cards (which non_clean_card_iterate_serial() does not |
474 } | 474 // do for us), and the ClearNoncleanCardWrapper closure itself does the work |
475 } | 475 // of finding contiguous dirty ranges of cards to process (and clear). |
476 | 476 cl->do_MemRegion(mr); |
477 // NOTE: For this to work correctly, it is important that | 477 } |
478 // we look for non-clean cards below (so as to catch those | 478 } |
479 // marked precleaned), rather than look explicitly for dirty | 479 } |
480 // cards (and miss those marked precleaned). In that sense, | 480 |
481 // the name precleaned is currently somewhat of a misnomer. | 481 // The iterator itself is not MT-aware, but |
482 void CardTableModRefBS::non_clean_card_iterate_work(MemRegion mr, | 482 // MT-aware callers and closures can use this to |
483 MemRegionClosure* cl) { | 483 // accomplish dirty card iteration in parallel. The |
484 // iterator itself does not clear the dirty cards, or | |
485 // change their values in any manner. | |
486 void CardTableModRefBS::non_clean_card_iterate_serial(MemRegion mr, | |
487 MemRegionClosure* cl) { | |
484 for (int i = 0; i < _cur_covered_regions; i++) { | 488 for (int i = 0; i < _cur_covered_regions; i++) { |
485 MemRegion mri = mr.intersection(_covered[i]); | 489 MemRegion mri = mr.intersection(_covered[i]); |
486 if (mri.word_size() > 0) { | 490 if (mri.word_size() > 0) { |
487 jbyte* cur_entry = byte_for(mri.last()); | 491 jbyte* cur_entry = byte_for(mri.last()); |
488 jbyte* limit = byte_for(mri.start()); | 492 jbyte* limit = byte_for(mri.start()); |
659 } | 663 } |
660 }; | 664 }; |
661 | 665 |
662 void CardTableModRefBS::verify_clean_region(MemRegion mr) { | 666 void CardTableModRefBS::verify_clean_region(MemRegion mr) { |
663 GuaranteeNotModClosure blk(this); | 667 GuaranteeNotModClosure blk(this); |
664 non_clean_card_iterate_work(mr, &blk); | 668 non_clean_card_iterate_serial(mr, &blk); |
665 } | 669 } |
666 | 670 |
667 // To verify a MemRegion is entirely dirty this closure is passed to | 671 // To verify a MemRegion is entirely dirty this closure is passed to |
668 // dirty_card_iterate. If the region is dirty do_MemRegion will be | 672 // dirty_card_iterate. If the region is dirty do_MemRegion will be |
669 // invoked only once with a MemRegion equal to the one being | 673 // invoked only once with a MemRegion equal to the one being |