hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp
changeset 25361 5146d1e12a2f
parent 24424 2658d7834c6e
child 26157 70eddb655686
equal deleted inserted replaced
25360:5b6141bf7564 25361:5146d1e12a2f
    50 // that compilers might normally perform in the case of non-G1
    50 // that compilers might normally perform in the case of non-G1
    51 // collectors needs to be carefully investigated prior to any such
    51 // collectors needs to be carefully investigated prior to any such
    52 // consolidation.
    52 // consolidation.
    53 
    53 
    54 // Forward declarations
    54 // Forward declarations
    55 class ContiguousSpace;
       
    56 class G1BlockOffsetSharedArray;
    55 class G1BlockOffsetSharedArray;
       
    56 class G1OffsetTableContigSpace;
    57 
    57 
    58 class G1BlockOffsetTable VALUE_OBJ_CLASS_SPEC {
    58 class G1BlockOffsetTable VALUE_OBJ_CLASS_SPEC {
    59   friend class VMStructs;
    59   friend class VMStructs;
    60 protected:
    60 protected:
    61   // These members describe the region covered by the table.
    61   // These members describe the region covered by the table.
   155   u_char offset_array(size_t index) const {
   155   u_char offset_array(size_t index) const {
   156     check_index(index, "index out of range");
   156     check_index(index, "index out of range");
   157     return _offset_array[index];
   157     return _offset_array[index];
   158   }
   158   }
   159 
   159 
       
   160   void set_offset_array(HeapWord* left, HeapWord* right, u_char offset);
       
   161 
   160   void set_offset_array(size_t index, u_char offset) {
   162   void set_offset_array(size_t index, u_char offset) {
   161     check_index(index, "index out of range");
   163     check_index(index, "index out of range");
   162     check_offset(offset, "offset too large");
   164     check_offset(offset, "offset too large");
   163     _offset_array[index] = offset;
   165     _offset_array[index] = offset;
   164   }
   166   }
   166   void set_offset_array(size_t index, HeapWord* high, HeapWord* low) {
   168   void set_offset_array(size_t index, HeapWord* high, HeapWord* low) {
   167     check_index(index, "index out of range");
   169     check_index(index, "index out of range");
   168     assert(high >= low, "addresses out of order");
   170     assert(high >= low, "addresses out of order");
   169     check_offset(pointer_delta(high, low), "offset too large");
   171     check_offset(pointer_delta(high, low), "offset too large");
   170     _offset_array[index] = (u_char) pointer_delta(high, low);
   172     _offset_array[index] = (u_char) pointer_delta(high, low);
   171   }
       
   172 
       
   173   void set_offset_array(HeapWord* left, HeapWord* right, u_char offset) {
       
   174     check_index(index_for(right - 1), "right address out of range");
       
   175     assert(left  < right, "Heap addresses out of order");
       
   176     size_t num_cards = pointer_delta(right, left) >> LogN_words;
       
   177     if (UseMemSetInBOT) {
       
   178       memset(&_offset_array[index_for(left)], offset, num_cards);
       
   179     } else {
       
   180       size_t i = index_for(left);
       
   181       const size_t end = i + num_cards;
       
   182       for (; i < end; i++) {
       
   183         _offset_array[i] = offset;
       
   184       }
       
   185     }
       
   186   }
   173   }
   187 
   174 
   188   void set_offset_array(size_t left, size_t right, u_char offset) {
   175   void set_offset_array(size_t left, size_t right, u_char offset) {
   189     check_index(right, "right index out of range");
   176     check_index(right, "right index out of range");
   190     assert(left <= right, "indexes out of order");
   177     assert(left <= right, "indexes out of order");
   279   // This is the array, which can be shared by several BlockOffsetArray's
   266   // This is the array, which can be shared by several BlockOffsetArray's
   280   // servicing different
   267   // servicing different
   281   G1BlockOffsetSharedArray* _array;
   268   G1BlockOffsetSharedArray* _array;
   282 
   269 
   283   // The space that owns this subregion.
   270   // The space that owns this subregion.
   284   Space* _sp;
   271   G1OffsetTableContigSpace* _gsp;
   285 
       
   286   // If "_sp" is a contiguous space, the field below is the view of "_sp"
       
   287   // as a contiguous space, else NULL.
       
   288   ContiguousSpace* _csp;
       
   289 
   272 
   290   // If true, array entries are initialized to 0; otherwise, they are
   273   // If true, array entries are initialized to 0; otherwise, they are
   291   // initialized to point backwards to the beginning of the covered region.
   274   // initialized to point backwards to the beginning of the covered region.
   292   bool _init_to_zero;
   275   bool _init_to_zero;
   293 
   276 
   308   // A helper function for BOT adjustment/verification work
   291   // A helper function for BOT adjustment/verification work
   309   void do_block_internal(HeapWord* blk_start, HeapWord* blk_end, Action action);
   292   void do_block_internal(HeapWord* blk_start, HeapWord* blk_end, Action action);
   310 
   293 
   311 protected:
   294 protected:
   312 
   295 
   313   ContiguousSpace* csp() const { return _csp; }
   296   G1OffsetTableContigSpace* gsp() const { return _gsp; }
       
   297 
       
   298   inline size_t block_size(const HeapWord* p) const;
   314 
   299 
   315   // Returns the address of a block whose start is at most "addr".
   300   // Returns the address of a block whose start is at most "addr".
   316   // If "has_max_index" is true, "assumes "max_index" is the last valid one
   301   // If "has_max_index" is true, "assumes "max_index" is the last valid one
   317   // in the array.
   302   // in the array.
   318   inline HeapWord* block_at_or_preceding(const void* addr,
   303   inline HeapWord* block_at_or_preceding(const void* addr,
   361 
   346 
   362   // Note: this ought to be part of the constructor, but that would require
   347   // Note: this ought to be part of the constructor, but that would require
   363   // "this" to be passed as a parameter to a member constructor for
   348   // "this" to be passed as a parameter to a member constructor for
   364   // the containing concrete subtype of Space.
   349   // the containing concrete subtype of Space.
   365   // This would be legal C++, but MS VC++ doesn't allow it.
   350   // This would be legal C++, but MS VC++ doesn't allow it.
   366   void set_space(Space* sp);
   351   void set_space(G1OffsetTableContigSpace* sp);
   367 
   352 
   368   // Resets the covered region to the given "mr".
   353   // Resets the covered region to the given "mr".
   369   void set_region(MemRegion mr);
   354   void set_region(MemRegion mr);
   370 
   355 
   371   // Resets the covered region to one with the same _bottom as before but
   356   // Resets the covered region to one with the same _bottom as before but