< prev index next >

src/hotspot/share/gc/g1/g1InCSetState.hpp

Print this page
rev 52675 : 8213890: Implementation of JEP 344: Abortable Mixed Collections for G1
Reviewed-by:
Contributed-by: erik.helin@oracle.com, stefan.johansson@oracle.com

@@ -54,11 +54,12 @@
     // this encoding allows us to use an > 0 check.
     // The positive values are encoded in increasing generation order, which
     // makes getting the next generation fast by a simple increment. They are also
     // used to index into arrays.
     // The negative values are used for objects requiring various special cases,
-    // for example eager reclamation of humongous objects.
+    // for example eager reclamation of humongous objects or optional regions.
+    Optional     = -2,    // The region is optional
     Humongous    = -1,    // The region is humongous
     NotInCSet    =  0,    // The region is not in the collection set.
     Young        =  1,    // The region is in the collection set and a young region.
     Old          =  2,    // The region is in the collection set and an old region.
     Num

@@ -76,14 +77,15 @@
   bool is_in_cset() const              { return _value > NotInCSet; }
 
   bool is_humongous() const            { return _value == Humongous; }
   bool is_young() const                { return _value == Young; }
   bool is_old() const                  { return _value == Old; }
+  bool is_optional() const             { return _value == Optional; }
 
 #ifdef ASSERT
   bool is_default() const              { return _value == NotInCSet; }
-  bool is_valid() const                { return (_value >= Humongous) && (_value < Num); }
+  bool is_valid() const                { return (_value >= Optional) && (_value < Num); }
   bool is_valid_gen() const            { return (_value >= Young && _value <= Old); }
 #endif
 };
 
 // Instances of this class are used for quick tests on whether a reference points

@@ -99,10 +101,16 @@
 // referenced, i.e. live.
 class G1InCSetStateFastTestBiasedMappedArray : public G1BiasedMappedArray<InCSetState> {
  protected:
   InCSetState default_value() const { return InCSetState::NotInCSet; }
  public:
+  void set_optional(uintptr_t index) {
+    assert(get_by_index(index).is_default(),
+           "State at index " INTPTR_FORMAT " should be default but is " CSETSTATE_FORMAT, index, get_by_index(index).value());
+    set_by_index(index, InCSetState::Optional);
+  }
+
   void set_humongous(uintptr_t index) {
     assert(get_by_index(index).is_default(),
            "State at index " INTPTR_FORMAT " should be default but is " CSETSTATE_FORMAT, index, get_by_index(index).value());
     set_by_index(index, InCSetState::Humongous);
   }
< prev index next >