annotate src/share/vm/memory/barrierSet.hpp @ 20304:a22acf6d7598

8048112: G1 Full GC needs to support the case when the very first region is not available Summary: Refactor preparation for compaction during Full GC so that it lazily initializes the first compaction point. This also avoids problems later when the first region may not be committed. Also reviewed by K. Barrett. Reviewed-by: brutisso
author tschatzl
date Mon, 21 Jul 2014 10:00:31 +0200
parents 3205e78d8193
children 8a9bb7821e28
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1245
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1245
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: 1245
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef SHARE_VM_MEMORY_BARRIERSET_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_MEMORY_BARRIERSET_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 "memory/memRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "oops/oopsHierarchy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30
0
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // This class provides the interface between a barrier implementation and
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // the rest of the system.
a61af66fc99e Initial load
duke
parents:
diff changeset
33
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 5984
diff changeset
34 class BarrierSet: public CHeapObj<mtGC> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
37 enum Name {
a61af66fc99e Initial load
duke
parents:
diff changeset
38 ModRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
39 CardTableModRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
40 CardTableExtension,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
41 G1SATBCT,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
42 G1SATBCTLogging,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
43 Other,
a61af66fc99e Initial load
duke
parents:
diff changeset
44 Uninit
a61af66fc99e Initial load
duke
parents:
diff changeset
45 };
a61af66fc99e Initial load
duke
parents:
diff changeset
46
2324
0ac769a57c64 6627983: G1: Bad oop deference during marking
iveresov
parents: 1972
diff changeset
47 enum Flags {
0ac769a57c64 6627983: G1: Bad oop deference during marking
iveresov
parents: 1972
diff changeset
48 None = 0,
0ac769a57c64 6627983: G1: Bad oop deference during marking
iveresov
parents: 1972
diff changeset
49 TargetUninitialized = 1
0ac769a57c64 6627983: G1: Bad oop deference during marking
iveresov
parents: 1972
diff changeset
50 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
51 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
52 int _max_covered_regions;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 Name _kind;
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
56
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
57 BarrierSet() { _kind = Uninit; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // To get around prohibition on RTTI.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
59 BarrierSet::Name kind() { return _kind; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
60 virtual bool is_a(BarrierSet::Name bsn) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // These operations indicate what kind of barriers the BarrierSet has.
a61af66fc99e Initial load
duke
parents:
diff changeset
63 virtual bool has_read_ref_barrier() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 virtual bool has_read_prim_barrier() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 virtual bool has_write_ref_barrier() = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
66 virtual bool has_write_ref_pre_barrier() = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67 virtual bool has_write_prim_barrier() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // These functions indicate whether a particular access of the given
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // kinds requires a barrier.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
71 virtual bool read_ref_needs_barrier(void* field) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 virtual bool read_prim_needs_barrier(HeapWord* field, size_t bytes) = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
73 virtual bool write_prim_needs_barrier(HeapWord* field, size_t bytes,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
74 juint val1, juint val2) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // The first four operations provide a direct implementation of the
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // barrier set. An interpreter loop, for example, could call these
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // directly, as appropriate.
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // Invoke the barrier, if any, necessary when reading the given ref field.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
81 virtual void read_ref_field(void* field) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Invoke the barrier, if any, necessary when reading the given primitive
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // "field" of "bytes" bytes in "obj".
a61af66fc99e Initial load
duke
parents:
diff changeset
85 virtual void read_prim_field(HeapWord* field, size_t bytes) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Invoke the barrier, if any, necessary when writing "new_val" into the
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // ref field at "offset" in "obj".
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // (For efficiency reasons, this operation is specialized for certain
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // barrier types. Semantically, it should be thought of as a call to the
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // virtual "_work" function below, which must implement the barrier.)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
92 // First the pre-write versions...
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 356
diff changeset
93 template <class T> inline void write_ref_field_pre(T* field, oop new_val);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 356
diff changeset
94 private:
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 356
diff changeset
95 // Keep this private so as to catch violations at build time.
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 356
diff changeset
96 virtual void write_ref_field_pre_work( void* field, oop new_val) { guarantee(false, "Not needed"); };
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
97 protected:
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 356
diff changeset
98 virtual void write_ref_field_pre_work( oop* field, oop new_val) {};
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 356
diff changeset
99 virtual void write_ref_field_pre_work(narrowOop* field, oop new_val) {};
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
100 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
101
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
102 // ...then the post-write version.
14443
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 6725
diff changeset
103 inline void write_ref_field(void* field, oop new_val, bool release = false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
104 protected:
14443
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 6725
diff changeset
105 virtual void write_ref_field_work(void* field, oop new_val, bool release = false) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
106 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // Invoke the barrier, if any, necessary when writing the "bytes"-byte
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // value(s) "val1" (and "val2") into the primitive "field".
a61af66fc99e Initial load
duke
parents:
diff changeset
110 virtual void write_prim_field(HeapWord* field, size_t bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
111 juint val1, juint val2) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // Operations on arrays, or general regions (e.g., for "clone") may be
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // optimized by some barriers.
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // The first six operations tell whether such an optimization exists for
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // the particular barrier.
a61af66fc99e Initial load
duke
parents:
diff changeset
118 virtual bool has_read_ref_array_opt() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 virtual bool has_read_prim_array_opt() = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
120 virtual bool has_write_ref_array_pre_opt() { return true; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
121 virtual bool has_write_ref_array_opt() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 virtual bool has_write_prim_array_opt() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 virtual bool has_read_region_opt() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 virtual bool has_write_region_opt() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // These operations should assert false unless the correponding operation
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // above returns true. Otherwise, they should perform an appropriate
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // barrier for an array whose elements are all in the given memory region.
a61af66fc99e Initial load
duke
parents:
diff changeset
130 virtual void read_ref_array(MemRegion mr) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 virtual void read_prim_array(MemRegion mr) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
132
1091
6aa7255741f3 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 845
diff changeset
133 // Below length is the # array elements being written
2324
0ac769a57c64 6627983: G1: Bad oop deference during marking
iveresov
parents: 1972
diff changeset
134 virtual void write_ref_array_pre(oop* dst, int length,
0ac769a57c64 6627983: G1: Bad oop deference during marking
iveresov
parents: 1972
diff changeset
135 bool dest_uninitialized = false) {}
0ac769a57c64 6627983: G1: Bad oop deference during marking
iveresov
parents: 1972
diff changeset
136 virtual void write_ref_array_pre(narrowOop* dst, int length,
0ac769a57c64 6627983: G1: Bad oop deference during marking
iveresov
parents: 1972
diff changeset
137 bool dest_uninitialized = false) {}
1091
6aa7255741f3 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 845
diff changeset
138 // Below count is the # array elements being written, starting
6aa7255741f3 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 845
diff changeset
139 // at the address "start", which may not necessarily be HeapWord-aligned
6aa7255741f3 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 845
diff changeset
140 inline void write_ref_array(HeapWord* start, size_t count);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
141
1091
6aa7255741f3 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 845
diff changeset
142 // Static versions, suitable for calling from generated code;
6aa7255741f3 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 845
diff changeset
143 // count is # array elements being written, starting with "start",
6aa7255741f3 6906727: UseCompressedOops: some card-marking fixes related to object arrays
ysr
parents: 845
diff changeset
144 // which may not necessarily be HeapWord-aligned.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
145 static void static_write_ref_array_pre(HeapWord* start, size_t count);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
146 static void static_write_ref_array_post(HeapWord* start, size_t count);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
147
0
a61af66fc99e Initial load
duke
parents:
diff changeset
148 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
149 virtual void write_ref_array_work(MemRegion mr) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
151 virtual void write_prim_array(MemRegion mr) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 virtual void read_region(MemRegion mr) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // (For efficiency reasons, this operation is specialized for certain
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // barrier types. Semantically, it should be thought of as a call to the
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // virtual "_work" function below, which must implement the barrier.)
a61af66fc99e Initial load
duke
parents:
diff changeset
158 inline void write_region(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
160 virtual void write_region_work(MemRegion mr) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // Some barrier sets create tables whose elements correspond to parts of
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // the heap; the CardTableModRefBS is an example. Such barrier sets will
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // normally reserve space for such tables, and commit parts of the table
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // "covering" parts of the heap that are committed. The constructor is
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // passed the maximum number of independently committable subregions to
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // be covered, and the "resize_covoered_region" function allows the
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // sub-parts of the heap to inform the barrier set of changes of their
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // sizes.
a61af66fc99e Initial load
duke
parents:
diff changeset
171 BarrierSet(int max_covered_regions) :
a61af66fc99e Initial load
duke
parents:
diff changeset
172 _max_covered_regions(max_covered_regions) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Inform the BarrierSet that the the covered heap region that starts
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // with "base" has been changed to have the given size (possibly from 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // for initialization.)
a61af66fc99e Initial load
duke
parents:
diff changeset
177 virtual void resize_covered_region(MemRegion new_region) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // If the barrier set imposes any alignment restrictions on boundaries
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // within the heap, this function tells whether they are met.
a61af66fc99e Initial load
duke
parents:
diff changeset
181 virtual bool is_aligned(HeapWord* addr) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
182
5984
fd09f2d8283e 7157141: crash in 64 bit with corrupted oops
never
parents: 2324
diff changeset
183 // Print a description of the memory for the barrier set
fd09f2d8283e 7157141: crash in 64 bit with corrupted oops
never
parents: 2324
diff changeset
184 virtual void print_on(outputStream* st) const = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
186
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
187 #endif // SHARE_VM_MEMORY_BARRIERSET_HPP