< prev index next >

src/share/vm/gc/shared/blockOffsetTable.hpp

Print this page

        

@@ -44,10 +44,38 @@
 //     - BlockOffsetArrayContigSpace
 //
 
 class ContiguousSpace;
 
+class BOTConstants : public AllStatic {
+public:
+  static const uint LogN = 9;
+  static const uint LogN_words = LogN - LogHeapWordSize;
+  static const uint N_bytes = 1 << LogN;
+  static const uint N_words = 1 << LogN_words;
+  // entries "e" of at least N_words mean "go back by Base^(e-N_words)."
+  // All entries are less than "N_words + N_powers".
+  static const uint LogBase = 4;
+  static const uint Base = (1 << LogBase);
+  static const uint N_powers = 14;
+
+  static size_t power_to_cards_back(uint i) {
+    return (size_t)1 << (LogBase * i);
+  }
+  static size_t power_to_words_back(uint i) {
+    return power_to_cards_back(i) * N_words;
+  }
+  static size_t entry_to_cards_back(u_char entry) {
+    assert(entry >= N_words, "Precondition");
+    return power_to_cards_back(entry - N_words);
+  }
+  static size_t entry_to_words_back(u_char entry) {
+    assert(entry >= N_words, "Precondition");
+    return power_to_words_back(entry - N_words);
+  }
+};
+
 //////////////////////////////////////////////////////////////////////////
 // The BlockOffsetTable "interface"
 //////////////////////////////////////////////////////////////////////////
 class BlockOffsetTable VALUE_OBJ_CLASS_SPEC {
   friend class VMStructs;

@@ -107,17 +135,10 @@
   friend class BlockOffsetArrayNonContigSpace;
   friend class BlockOffsetArrayContigSpace;
   friend class VMStructs;
 
  private:
-  enum SomePrivateConstants {
-    LogN = 9,
-    LogN_words = LogN - LogHeapWordSize,
-    N_bytes = 1 << LogN,
-    N_words = 1 << LogN_words
-  };
-
   bool _init_to_zero;
 
   // The reserved region covered by the shared array.
   MemRegion _reserved;
 

@@ -161,22 +182,22 @@
 
   void set_offset_array(size_t index, HeapWord* high, HeapWord* low, bool reducing = false) {
     check_reducing_assertion(reducing);
     assert(index < _vs.committed_size(), "index out of range");
     assert(high >= low, "addresses out of order");
-    assert(pointer_delta(high, low) <= N_words, "offset too large");
+    assert(pointer_delta(high, low) <= BOTConstants::N_words, "offset too large");
     assert(!reducing || _offset_array[index] >=  (u_char)pointer_delta(high, low),
            "Not reducing");
     _offset_array[index] = (u_char)pointer_delta(high, low);
   }
 
   void set_offset_array(HeapWord* left, HeapWord* right, u_char offset, bool reducing = false) {
     check_reducing_assertion(reducing);
     assert(index_for(right - 1) < _vs.committed_size(),
            "right address out of range");
     assert(left  < right, "Heap addresses out of order");
-    size_t num_cards = pointer_delta(right, left) >> LogN_words;
+    size_t num_cards = pointer_delta(right, left) >> BOTConstants::LogN_words;
 
     fill_range(index_for(left), num_cards, offset);
   }
 
   void set_offset_array(size_t left, size_t right, u_char offset, bool reducing = false) {

@@ -189,11 +210,11 @@
   }
 
   void check_offset_array(size_t index, HeapWord* high, HeapWord* low) const {
     assert(index < _vs.committed_size(), "index out of range");
     assert(high >= low, "addresses out of order");
-    assert(pointer_delta(high, low) <= N_words, "offset too large");
+    assert(pointer_delta(high, low) <= BOTConstants::N_words, "offset too large");
     assert(_offset_array[index] == pointer_delta(high, low),
            "Wrong offset");
   }
 
   bool is_card_boundary(HeapWord* p) const;

@@ -204,11 +225,11 @@
   // ends on a card boundary we put a 0 in the next
   // offset array slot, so we want that slot always
   // to be reserved.
 
   size_t compute_size(size_t mem_region_words) {
-    size_t number_of_slots = (mem_region_words / N_words) + 1;
+    size_t number_of_slots = (mem_region_words / BOTConstants::N_words) + 1;
     return ReservedSpace::allocation_align_size_up(number_of_slots);
   }
 
 public:
   // Initialize the table to cover from "base" to (at least)

@@ -246,45 +267,19 @@
 //////////////////////////////////////////////////////////////////////////
 // The BlockOffsetArray whose subtypes use the BlockOffsetSharedArray.
 //////////////////////////////////////////////////////////////////////////
 class BlockOffsetArray: public BlockOffsetTable {
   friend class VMStructs;
-  friend class G1BlockOffsetTablePart; // temp. until we restructure and cleanup
  protected:
   // The following enums are used by do_block_internal() below
   enum Action {
     Action_single,      // BOT records a single block (see single_block())
     Action_mark,        // BOT marks the start of a block (see mark_block())
     Action_check        // Check that BOT records block correctly
                         // (see verify_single_block()).
   };
 
-  enum SomePrivateConstants {
-    N_words = BlockOffsetSharedArray::N_words,
-    LogN    = BlockOffsetSharedArray::LogN,
-    // entries "e" of at least N_words mean "go back by Base^(e-N_words)."
-    // All entries are less than "N_words + N_powers".
-    LogBase = 4,
-    Base = (1 << LogBase),
-    N_powers = 14
-  };
-
-  static size_t power_to_cards_back(uint i) {
-    return (size_t)1 << (LogBase * i);
-  }
-  static size_t power_to_words_back(uint i) {
-    return power_to_cards_back(i) * N_words;
-  }
-  static size_t entry_to_cards_back(u_char entry) {
-    assert(entry >= N_words, "Precondition");
-    return power_to_cards_back(entry - N_words);
-  }
-  static size_t entry_to_words_back(u_char entry) {
-    assert(entry >= N_words, "Precondition");
-    return power_to_words_back(entry - N_words);
-  }
-
   // The shared array, which is shared with other BlockOffsetArray's
   // corresponding to different spaces within a generation or span of
   // memory.
   BlockOffsetSharedArray* _array;
 

@@ -342,11 +337,11 @@
       assert(_array->is_card_boundary(_end),
              "_end not a card boundary");
       assert(_array->is_card_boundary(new_end),
              "new _end would not be a card boundary");
       // set all the newly added cards
-      _array->set_offset_array(_end, new_end, N_words);
+      _array->set_offset_array(_end, new_end, BOTConstants::N_words);
     }
     _end = new_end;  // update _end
   }
 
   // Adjust the BOT to show that it has a single block in the
< prev index next >