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);
|