Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/g1/g1BiasedArray.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 | 78bbf4d43a14 |
children | 52b4284cb496 |
rev | line source |
---|---|
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
1 /* |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17760
diff
changeset
|
2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
4 * |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
8 * |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
13 * accompanied this code). |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
14 * |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
18 * |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
21 * questions. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
22 * |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
23 */ |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
24 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1BIASEDARRAY_HPP |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1BIASEDARRAY_HPP |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
27 |
17760
5479cb006184
8036860: Pad and cache-align the BiasedMappedArray
tschatzl
parents:
12305
diff
changeset
|
28 #include "memory/allocation.hpp" |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
29 #include "utilities/debug.hpp" |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
30 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
31 // Implements the common base functionality for arrays that contain provisions |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
32 // for accessing its elements using a biased index. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
33 // The element type is defined by the instantiating the template. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
34 class G1BiasedMappedArrayBase VALUE_OBJ_CLASS_SPEC { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
35 friend class VMStructs; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
36 public: |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
37 typedef size_t idx_t; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
38 protected: |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
39 address _base; // the real base address |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
40 size_t _length; // the length of the array |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
41 address _biased_base; // base address biased by "bias" elements |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
42 size_t _bias; // the bias, i.e. the offset biased_base is located to the right in elements |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
43 uint _shift_by; // the amount of bits to shift right when mapping to an index of the array. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
44 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
45 protected: |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
46 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
47 G1BiasedMappedArrayBase() : _base(NULL), _length(0), _biased_base(NULL), |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
48 _bias(0), _shift_by(0) { } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
49 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
50 // Allocate a new array, generic version. |
17760
5479cb006184
8036860: Pad and cache-align the BiasedMappedArray
tschatzl
parents:
12305
diff
changeset
|
51 static address create_new_base_array(size_t length, size_t elem_size); |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
52 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
53 // Initialize the members of this class. The biased start address of this array |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
54 // is the bias (in elements) multiplied by the element size. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
55 void initialize_base(address base, size_t length, size_t bias, size_t elem_size, uint shift_by) { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
56 assert(base != NULL, "just checking"); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
57 assert(length > 0, "just checking"); |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17760
diff
changeset
|
58 assert(shift_by < sizeof(uintptr_t) * 8, err_msg("Shifting by " SSIZE_FORMAT ", larger than word size?", (size_t) shift_by)); |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
59 _base = base; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
60 _length = length; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
61 _biased_base = base - (bias * elem_size); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
62 _bias = bias; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
63 _shift_by = shift_by; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
64 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
65 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
66 // Allocate and initialize this array to cover the heap addresses in the range |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
67 // of [bottom, end). |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
68 void initialize(HeapWord* bottom, HeapWord* end, size_t target_elem_size_in_bytes, size_t mapping_granularity_in_bytes) { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
69 assert(mapping_granularity_in_bytes > 0, "just checking"); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
70 assert(is_power_of_2(mapping_granularity_in_bytes), |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
71 err_msg("mapping granularity must be power of 2, is %zd", mapping_granularity_in_bytes)); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
72 assert((uintptr_t)bottom % mapping_granularity_in_bytes == 0, |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17760
diff
changeset
|
73 err_msg("bottom mapping area address must be a multiple of mapping granularity %zd, is " PTR_FORMAT, |
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17760
diff
changeset
|
74 mapping_granularity_in_bytes, p2i(bottom))); |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
75 assert((uintptr_t)end % mapping_granularity_in_bytes == 0, |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17760
diff
changeset
|
76 err_msg("end mapping area address must be a multiple of mapping granularity %zd, is " PTR_FORMAT, |
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17760
diff
changeset
|
77 mapping_granularity_in_bytes, p2i(end))); |
12305
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
78 size_t num_target_elems = (end - bottom) / (mapping_granularity_in_bytes / HeapWordSize); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
79 idx_t bias = (uintptr_t)bottom / mapping_granularity_in_bytes; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
80 address base = create_new_base_array(num_target_elems, target_elem_size_in_bytes); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
81 initialize_base(base, num_target_elems, bias, target_elem_size_in_bytes, log2_intptr(mapping_granularity_in_bytes)); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
82 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
83 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
84 size_t bias() const { return _bias; } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
85 uint shift_by() const { return _shift_by; } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
86 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
87 void verify_index(idx_t index) const PRODUCT_RETURN; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
88 void verify_biased_index(idx_t biased_index) const PRODUCT_RETURN; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
89 void verify_biased_index_inclusive_end(idx_t biased_index) const PRODUCT_RETURN; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
90 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
91 public: |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
92 // Return the length of the array in elements. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
93 size_t length() const { return _length; } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
94 }; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
95 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
96 // Array that provides biased access and mapping from (valid) addresses in the |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
97 // heap into this array. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
98 template<class T> |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
99 class G1BiasedMappedArray : public G1BiasedMappedArrayBase { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
100 public: |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
101 typedef G1BiasedMappedArrayBase::idx_t idx_t; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
102 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
103 T* base() const { return (T*)G1BiasedMappedArrayBase::_base; } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
104 // Return the element of the given array at the given index. Assume |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
105 // the index is valid. This is a convenience method that does sanity |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
106 // checking on the index. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
107 T get_by_index(idx_t index) const { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
108 verify_index(index); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
109 return this->base()[index]; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
110 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
111 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
112 // Set the element of the given array at the given index to the |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
113 // given value. Assume the index is valid. This is a convenience |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
114 // method that does sanity checking on the index. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
115 void set_by_index(idx_t index, T value) { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
116 verify_index(index); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
117 this->base()[index] = value; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
118 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
119 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
120 // The raw biased base pointer. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
121 T* biased_base() const { return (T*)G1BiasedMappedArrayBase::_biased_base; } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
122 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
123 // Return the element of the given array that covers the given word in the |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
124 // heap. Assumes the index is valid. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
125 T get_by_address(HeapWord* value) const { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
126 idx_t biased_index = ((uintptr_t)value) >> this->shift_by(); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
127 this->verify_biased_index(biased_index); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
128 return biased_base()[biased_index]; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
129 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
130 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
131 // Set the value of the array entry that corresponds to the given array. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
132 void set_by_address(HeapWord * address, T value) { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
133 idx_t biased_index = ((uintptr_t)address) >> this->shift_by(); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
134 this->verify_biased_index(biased_index); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
135 biased_base()[biased_index] = value; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
136 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
137 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
138 protected: |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
139 // Returns the address of the element the given address maps to |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
140 T* address_mapped_to(HeapWord* address) { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
141 idx_t biased_index = ((uintptr_t)address) >> this->shift_by(); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
142 this->verify_biased_index_inclusive_end(biased_index); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
143 return biased_base() + biased_index; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
144 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
145 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
146 public: |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
147 // Return the smallest address (inclusive) in the heap that this array covers. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
148 HeapWord* bottom_address_mapped() const { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
149 return (HeapWord*) ((uintptr_t)this->bias() << this->shift_by()); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
150 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
151 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
152 // Return the highest address (exclusive) in the heap that this array covers. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
153 HeapWord* end_address_mapped() const { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
154 return (HeapWord*) ((uintptr_t)(this->bias() + this->length()) << this->shift_by()); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
155 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
156 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
157 protected: |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
158 virtual T default_value() const = 0; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
159 // Set all elements of the given array to the given value. |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
160 void clear() { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
161 T value = default_value(); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
162 for (idx_t i = 0; i < length(); i++) { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
163 set_by_index(i, value); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
164 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
165 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
166 public: |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
167 G1BiasedMappedArray() {} |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
168 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
169 // Allocate and initialize this array to cover the heap addresses in the range |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
170 // of [bottom, end). |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
171 void initialize(HeapWord* bottom, HeapWord* end, size_t mapping_granularity) { |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
172 G1BiasedMappedArrayBase::initialize(bottom, end, sizeof(T), mapping_granularity); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
173 this->clear(); |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
174 } |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
175 }; |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
176 |
a19bea467577
7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents:
diff
changeset
|
177 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1BIASEDARRAY_HPP |