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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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