1.1 --- a/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp Tue Aug 19 10:50:27 2014 +0200 1.2 +++ b/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp Thu Aug 21 11:47:10 2014 +0200 1.3 @@ -25,6 +25,7 @@ 1.4 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1SATBCARDTABLEMODREFBS_HPP 1.5 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1SATBCARDTABLEMODREFBS_HPP 1.6 1.7 +#include "gc_implementation/g1/g1RegionToSpaceMapper.hpp" 1.8 #include "memory/cardTableModRefBS.hpp" 1.9 #include "memory/memRegion.hpp" 1.10 #include "oops/oop.inline.hpp" 1.11 @@ -33,6 +34,7 @@ 1.12 #if INCLUDE_ALL_GCS 1.13 1.14 class DirtyCardQueueSet; 1.15 +class G1SATBCardTableLoggingModRefBS; 1.16 1.17 // This barrier is specialized to use a logging barrier to support 1.18 // snapshot-at-the-beginning marking. 1.19 @@ -126,18 +128,40 @@ 1.20 jbyte val = _byte_map[card_index]; 1.21 return (val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val(); 1.22 } 1.23 +}; 1.24 1.25 +class G1SATBCardTableLoggingModRefBSChangedListener : public G1MappingChangedListener { 1.26 + private: 1.27 + G1SATBCardTableLoggingModRefBS* _card_table; 1.28 + public: 1.29 + G1SATBCardTableLoggingModRefBSChangedListener() : _card_table(NULL) { } 1.30 + 1.31 + void set_card_table(G1SATBCardTableLoggingModRefBS* card_table) { _card_table = card_table; } 1.32 + 1.33 + virtual void on_commit(uint start_idx, size_t num_regions); 1.34 }; 1.35 1.36 // Adds card-table logging to the post-barrier. 1.37 // Usual invariant: all dirty cards are logged in the DirtyCardQueueSet. 1.38 class G1SATBCardTableLoggingModRefBS: public G1SATBCardTableModRefBS { 1.39 + friend class G1SATBCardTableLoggingModRefBSChangedListener; 1.40 private: 1.41 + G1SATBCardTableLoggingModRefBSChangedListener _listener; 1.42 DirtyCardQueueSet& _dcqs; 1.43 public: 1.44 + static size_t compute_size(size_t mem_region_size_in_words) { 1.45 + size_t number_of_slots = (mem_region_size_in_words / card_size_in_words); 1.46 + return ReservedSpace::allocation_align_size_up(number_of_slots); 1.47 + } 1.48 + 1.49 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap, 1.50 int max_covered_regions); 1.51 1.52 + virtual void initialize() { } 1.53 + virtual void initialize(G1RegionToSpaceMapper* mapper); 1.54 + 1.55 + virtual void resize_covered_region(MemRegion new_region) { ShouldNotReachHere(); } 1.56 + 1.57 bool is_a(BarrierSet::Name bsn) { 1.58 return bsn == BarrierSet::G1SATBCTLogging || 1.59 G1SATBCardTableModRefBS::is_a(bsn); 1.60 @@ -154,8 +178,6 @@ 1.61 1.62 void write_region_work(MemRegion mr) { invalidate(mr); } 1.63 void write_ref_array_work(MemRegion mr) { invalidate(mr); } 1.64 - 1.65 - 1.66 }; 1.67 1.68