< prev index next >

src/share/vm/gc/g1/g1CardLiveData.hpp

Print this page
rev 10869 : [mq]: 8153170-kim-review

@@ -44,10 +44,21 @@
   typedef BitMap::bm_word_t bm_word_t;
   // Store some additional information about the covered area to be able to test.
   size_t _max_capacity;
   size_t _cards_per_region;
 
+  // Regions may be reclaimed while concurrently creating live data (e.g. due to humongous
+  // eager reclaim). This results in wrong live data for these regions at the end.
+  // So we need to somehow detect these regions, and during live data finalization completely
+  // recreate their information.
+  // This _gc_timestamp_at_create tracks the global timestamp when live data creation
+  // has started. Any regions with a higher time stamp have been cleared after that
+  // point in time, and need re-finalization.
+  // Unsynchronized access to this variable is okay, since this value is only set during a
+  // concurrent phase, and read only at the Cleanup safepoint. I.e. there is always
+  // full memory synchronization inbetween.
+  uint _gc_timestamp_at_create;
   // The per-card liveness bitmap.
   bm_word_t* _live_cards;
   size_t _live_cards_size_in_bits;
   // The per-region liveness bitmap.
   bm_word_t* _live_regions;

@@ -67,10 +78,12 @@
   inline bool is_card_live_at(BitMap::idx_t idx) const;
 
   size_t live_region_bitmap_size_in_bits() const;
   size_t live_card_bitmap_size_in_bits() const;
 public:
+  uint gc_timestamp_at_create() const { return _gc_timestamp_at_create; }
+
   inline bool is_region_live(uint region) const;
 
   inline void remove_nonlive_cards(uint region, BitMap* bm);
   inline void remove_nonlive_regions(BitMap* bm);
 
< prev index next >