annotate src/share/vm/gc_implementation/g1/g1BlockOffsetTable.inline.hpp @ 20504:6948da6d7c13

8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set Summary: Remove -XX:-G1DeferredRSUpdate functionality as it is racy. During evacuation failure handling, threads where evacuation failure handling occurred may try to add remembered sets to regions which remembered sets are currently being scanned. The iterator to handle the remembered set scan does not support addition of entries during scan and so may skip valid references. Reviewed-by: iveresov, brutisso, mgerdin
author tschatzl
date Tue, 30 Sep 2014 09:44:36 +0200
parents 1f1d373cd044
children 0fcaab91d485
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1 /*
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 7181
diff changeset
2 * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
7 * published by the Free Software Foundation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
8 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
13 * accompanied this code).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
14 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 845
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 845
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 845
diff changeset
21 * questions.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
22 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
23 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1BLOCKOFFSETTABLE_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1BLOCKOFFSETTABLE_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "gc_implementation/g1/g1BlockOffsetTable.hpp"
20276
1526a938e670 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 20273
diff changeset
29 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
1526a938e670 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 20273
diff changeset
30 #include "gc_implementation/g1/heapRegion.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "memory/space.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
33 inline HeapWord* G1BlockOffsetTable::block_start(const void* addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
34 if (addr >= _bottom && addr < _end) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35 return block_start_unsafe(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
36 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
37 return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
38 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
39 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
40
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41 inline HeapWord*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
42 G1BlockOffsetTable::block_start_const(const void* addr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
43 if (addr >= _bottom && addr < _end) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44 return block_start_unsafe_const(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
49
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
50 #define check_index(index, msg) \
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
51 assert((index) < (_reserved.word_size() >> LogN_words), \
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
52 err_msg("%s - index: "SIZE_FORMAT", _vs.committed_size: "SIZE_FORMAT, \
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
53 msg, (index), (_reserved.word_size() >> LogN_words))); \
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
54 assert(G1CollectedHeap::heap()->is_in_exact(address_for_index_raw(index)), \
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
55 err_msg("Index "SIZE_FORMAT" corresponding to "PTR_FORMAT \
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
56 " (%u) is not in committed area.", \
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
57 (index), \
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
58 p2i(address_for_index_raw(index)), \
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
59 G1CollectedHeap::heap()->addr_to_region(address_for_index_raw(index))));
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
60
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
61 u_char G1BlockOffsetSharedArray::offset_array(size_t index) const {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
62 check_index(index, "index out of range");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
63 return _offset_array[index];
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
64 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
65
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
66 void G1BlockOffsetSharedArray::set_offset_array(size_t index, u_char offset) {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
67 check_index(index, "index out of range");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
68 set_offset_array_raw(index, offset);
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
69 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
70
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
71 void G1BlockOffsetSharedArray::set_offset_array(size_t index, HeapWord* high, HeapWord* low) {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
72 check_index(index, "index out of range");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
73 assert(high >= low, "addresses out of order");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
74 size_t offset = pointer_delta(high, low);
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
75 check_offset(offset, "offset too large");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
76 set_offset_array(index, (u_char)offset);
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
77 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
78
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
79 void G1BlockOffsetSharedArray::set_offset_array(size_t left, size_t right, u_char offset) {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
80 check_index(right, "right index out of range");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
81 assert(left <= right, "indexes out of order");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
82 size_t num_cards = right - left + 1;
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
83 if (UseMemSetInBOT) {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
84 memset(&_offset_array[left], offset, num_cards);
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
85 } else {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
86 size_t i = left;
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
87 const size_t end = i + num_cards;
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
88 for (; i < end; i++) {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
89 _offset_array[i] = offset;
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
90 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
91 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
92 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
93
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
94 void G1BlockOffsetSharedArray::check_offset_array(size_t index, HeapWord* high, HeapWord* low) const {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
95 check_index(index, "index out of range");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
96 assert(high >= low, "addresses out of order");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
97 check_offset(pointer_delta(high, low), "offset too large");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
98 assert(_offset_array[index] == pointer_delta(high, low), "Wrong offset");
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
99 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
100
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
101 // Variant of index_for that does not check the index for validity.
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
102 inline size_t G1BlockOffsetSharedArray::index_for_raw(const void* p) const {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
103 return pointer_delta((char*)p, _reserved.start(), sizeof(char)) >> LogN;
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
104 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
105
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
106 inline size_t G1BlockOffsetSharedArray::index_for(const void* p) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
107 char* pc = (char*)p;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
108 assert(pc >= (char*)_reserved.start() &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
109 pc < (char*)_reserved.end(),
7181
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
110 err_msg("p (" PTR_FORMAT ") not in reserved [" PTR_FORMAT ", " PTR_FORMAT ")",
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 7181
diff changeset
111 p2i(p), p2i(_reserved.start()), p2i(_reserved.end())));
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
112 size_t result = index_for_raw(p);
7181
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
113 check_index(result, "bad index from address");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
114 return result;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
115 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
116
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
117 inline HeapWord*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
118 G1BlockOffsetSharedArray::address_for_index(size_t index) const {
7181
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
119 check_index(index, "index out of range");
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
120 HeapWord* result = address_for_index_raw(index);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
121 assert(result >= _reserved.start() && result < _reserved.end(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
122 err_msg("bad address from index result " PTR_FORMAT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
123 " _reserved.start() " PTR_FORMAT " _reserved.end() "
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
124 PTR_FORMAT,
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 7181
diff changeset
125 p2i(result), p2i(_reserved.start()), p2i(_reserved.end())));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
126 return result;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
127 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
128
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
129 #undef check_index
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20278
diff changeset
130
20273
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
131 inline size_t
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
132 G1BlockOffsetArray::block_size(const HeapWord* p) const {
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
133 return gsp()->block_size(p);
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
134 }
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
135
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136 inline HeapWord*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
137 G1BlockOffsetArray::block_at_or_preceding(const void* addr,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138 bool has_max_index,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
139 size_t max_index) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 assert(_array->offset_array(0) == 0, "objects can't cross covered areas");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
141 size_t index = _array->index_for(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 // We must make sure that the offset table entry we use is valid. If
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143 // "addr" is past the end, start at the last known one and go forward.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
144 if (has_max_index) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 index = MIN2(index, max_index);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147 HeapWord* q = _array->address_for_index(index);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
149 uint offset = _array->offset_array(index); // Extend u_char to uint.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
150 while (offset >= N_words) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
151 // The excess of the offset from N_words indicates a power of Base
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
152 // to go back by.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
153 size_t n_cards_back = BlockOffsetArray::entry_to_cards_back(offset);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154 q -= (N_words * n_cards_back);
20273
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
155 assert(q >= gsp()->bottom(), "Went below bottom!");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
156 index -= n_cards_back;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
157 offset = _array->offset_array(index);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
158 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
159 assert(offset < N_words, "offset too large");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
160 q -= offset;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
161 return q;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
162 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
163
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
164 inline HeapWord*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
165 G1BlockOffsetArray::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
166 forward_to_block_containing_addr_const(HeapWord* q, HeapWord* n,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
167 const void* addr) const {
20273
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
168 if (addr >= gsp()->top()) return gsp()->top();
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
169 while (n <= addr) {
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
170 q = n;
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
171 oop obj = oop(q);
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
172 if (obj->klass_or_null() == NULL) return q;
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20276
diff changeset
173 n += block_size(q);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175 assert(q <= n, "wrong order for q and addr");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
176 assert(addr < n, "wrong order for addr and n");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 return q;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
179
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180 inline HeapWord*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 G1BlockOffsetArray::forward_to_block_containing_addr(HeapWord* q,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
182 const void* addr) {
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
183 if (oop(q)->klass_or_null() == NULL) return q;
20273
9441d22e429a 8047820: G1 Block offset table does not need to support generic Space classes
mgerdin
parents: 17937
diff changeset
184 HeapWord* n = q + block_size(q);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
185 // In the normal case, where the query "addr" is a card boundary, and the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
186 // offset table chunks are the same size as cards, the block starting at
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
187 // "q" will contain addr, so the test below will fail, and we'll fall
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
188 // through quickly.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
189 if (n <= addr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
190 q = forward_to_block_containing_addr_slow(q, n, addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
191 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
192 assert(q <= addr, "wrong order for current and arg");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193 return q;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
196 //////////////////////////////////////////////////////////////////////////
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
197 // BlockOffsetArrayNonContigSpace inlines
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 //////////////////////////////////////////////////////////////////////////
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199 inline void G1BlockOffsetArray::freed(HeapWord* blk_start, HeapWord* blk_end) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
200 // Verify that the BOT shows [blk_start, blk_end) to be one block.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
201 verify_single_block(blk_start, blk_end);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202 // adjust _unallocated_block upward or downward
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 // as appropriate
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 if (BlockOffsetArrayUseUnallocatedBlock) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
205 assert(_unallocated_block <= _end,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206 "Inconsistent value for _unallocated_block");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207 if (blk_end >= _unallocated_block && blk_start <= _unallocated_block) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208 // CMS-specific note: a block abutting _unallocated_block to
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 // its left is being freed, a new block is being added or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210 // we are resetting following a compaction
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 _unallocated_block = blk_start;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 inline void G1BlockOffsetArray::freed(HeapWord* blk, size_t size) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217 freed(blk, blk + size);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
219
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
220 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1BLOCKOFFSETTABLE_INLINE_HPP