< prev index next >

src/hotspot/share/gc/g1/g1BlockOffsetTable.inline.hpp

Print this page
rev 55196 : 8225716: G1 GC: Undefined behaviour in G1BlockOffsetTablePart::block_at_or_preceding
Reviewed-by: duke


  34   if (addr >= _space->bottom() && addr < _space->end()) {
  35     HeapWord* q = block_at_or_preceding(addr, true, _next_offset_index-1);
  36     return forward_to_block_containing_addr(q, addr);
  37   } else {
  38     return NULL;
  39   }
  40 }
  41 
  42 inline HeapWord* G1BlockOffsetTablePart::block_start_const(const void* addr) const {
  43   if (addr >= _space->bottom() && addr < _space->end()) {
  44     HeapWord* q = block_at_or_preceding(addr, true, _next_offset_index-1);
  45     HeapWord* n = q + block_size(q);
  46     return forward_to_block_containing_addr_const(q, n, addr);
  47   } else {
  48     return NULL;
  49   }
  50 }
  51 
  52 u_char G1BlockOffsetTable::offset_array(size_t index) const {
  53   check_index(index, "index out of range");
  54   return _offset_array[index];
  55 }
  56 
  57 void G1BlockOffsetTable::set_offset_array(size_t index, u_char offset) {
  58   check_index(index, "index out of range");
  59   set_offset_array_raw(index, offset);
  60 }
  61 
  62 void G1BlockOffsetTable::set_offset_array(size_t index, HeapWord* high, HeapWord* low) {
  63   check_index(index, "index out of range");
  64   assert(high >= low, "addresses out of order");
  65   size_t offset = pointer_delta(high, low);
  66   check_offset(offset, "offset too large");
  67   set_offset_array(index, (u_char)offset);
  68 }
  69 
  70 void G1BlockOffsetTable::set_offset_array(size_t left, size_t right, u_char offset) {
  71   check_index(right, "right index out of range");
  72   assert(left <= right, "indexes out of order");
  73   size_t num_cards = right - left + 1;
  74   memset_with_concurrent_readers(&_offset_array[left], offset, num_cards);




  34   if (addr >= _space->bottom() && addr < _space->end()) {
  35     HeapWord* q = block_at_or_preceding(addr, true, _next_offset_index-1);
  36     return forward_to_block_containing_addr(q, addr);
  37   } else {
  38     return NULL;
  39   }
  40 }
  41 
  42 inline HeapWord* G1BlockOffsetTablePart::block_start_const(const void* addr) const {
  43   if (addr >= _space->bottom() && addr < _space->end()) {
  44     HeapWord* q = block_at_or_preceding(addr, true, _next_offset_index-1);
  45     HeapWord* n = q + block_size(q);
  46     return forward_to_block_containing_addr_const(q, n, addr);
  47   } else {
  48     return NULL;
  49   }
  50 }
  51 
  52 u_char G1BlockOffsetTable::offset_array(size_t index) const {
  53   check_index(index, "index out of range");
  54   return Atomic::load(&_offset_array[index]);
  55 }
  56 
  57 void G1BlockOffsetTable::set_offset_array(size_t index, u_char offset) {
  58   check_index(index, "index out of range");
  59   set_offset_array_raw(index, offset);
  60 }
  61 
  62 void G1BlockOffsetTable::set_offset_array(size_t index, HeapWord* high, HeapWord* low) {
  63   check_index(index, "index out of range");
  64   assert(high >= low, "addresses out of order");
  65   size_t offset = pointer_delta(high, low);
  66   check_offset(offset, "offset too large");
  67   set_offset_array(index, (u_char)offset);
  68 }
  69 
  70 void G1BlockOffsetTable::set_offset_array(size_t left, size_t right, u_char offset) {
  71   check_index(right, "right index out of range");
  72   assert(left <= right, "indexes out of order");
  73   size_t num_cards = right - left + 1;
  74   memset_with_concurrent_readers(&_offset_array[left], offset, num_cards);


< prev index next >