Mercurial > hg > graal-compiler
annotate src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp @ 17833:bfdf528be8e8
8038498: Fix includes and C inlining after 8035330
Summary: Change 8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure broke the debug build on AIX. The method do_oop_partial_array() is added in a header, but requires the inline function par_write_ref() through several inlined calls. In some cpp files, like arguments.cpp, par_write_ref() is not defined as the corresponding inline header and is not included. The AIX debug VM does not start because of the missing symbol. This change solves this by cleaning up include dependencies.
Reviewed-by: tschatzl, stefank
author | tschatzl |
---|---|
date | Fri, 04 Apr 2014 10:43:56 +0200 |
parents | 3205e78d8193 |
children | 4ca6dc0799b6 6a0ad2977919 |
rev | line source |
---|---|
342 | 1 /* |
12316
190899198332
7195622: CheckUnhandledOops has limited usefulness now
hseigel
parents:
11068
diff
changeset
|
2 * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. |
342 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1317
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1317
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:
1317
diff
changeset
|
21 * questions. |
342 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" | |
27 #include "gc_implementation/g1/heapRegion.hpp" | |
28 #include "gc_implementation/g1/satbQueue.hpp" | |
29 #include "runtime/mutexLocker.hpp" | |
7180
f34d701e952e
8003935: Simplify the needed includes for using Thread::current()
stefank
parents:
3960
diff
changeset
|
30 #include "runtime/thread.inline.hpp" |
342 | 31 |
32 G1SATBCardTableModRefBS::G1SATBCardTableModRefBS(MemRegion whole_heap, | |
33 int max_covered_regions) : | |
34 CardTableModRefBSForCTRS(whole_heap, max_covered_regions) | |
35 { | |
36 _kind = G1SATBCT; | |
37 } | |
38 | |
39 | |
40 void G1SATBCardTableModRefBS::enqueue(oop pre_val) { | |
3249
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
1972
diff
changeset
|
41 // Nulls should have been already filtered. |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
1972
diff
changeset
|
42 assert(pre_val->is_oop(true), "Error"); |
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
1972
diff
changeset
|
43 |
1317
d4197f8d516a
6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents:
845
diff
changeset
|
44 if (!JavaThread::satb_mark_queue_set().is_active()) return; |
342 | 45 Thread* thr = Thread::current(); |
46 if (thr->is_Java_thread()) { | |
47 JavaThread* jt = (JavaThread*)thr; | |
48 jt->satb_mark_queue().enqueue(pre_val); | |
49 } else { | |
11068
b30744960351
8014022: G1: Non Java threads should lock the shared SATB queue lock without safepoint checks.
brutisso
parents:
7180
diff
changeset
|
50 MutexLockerEx x(Shared_SATB_Q_lock, Mutex::_no_safepoint_check_flag); |
342 | 51 JavaThread::satb_mark_queue_set().shared_satb_queue()->enqueue(pre_val); |
52 } | |
53 } | |
54 | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
55 template <class T> void |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
56 G1SATBCardTableModRefBS::write_ref_array_pre_work(T* dst, int count) { |
1317
d4197f8d516a
6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents:
845
diff
changeset
|
57 if (!JavaThread::satb_mark_queue_set().is_active()) return; |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
58 T* elem_ptr = dst; |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
59 for (int i = 0; i < count; i++, elem_ptr++) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
60 T heap_oop = oopDesc::load_heap_oop(elem_ptr); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
61 if (!oopDesc::is_null(heap_oop)) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
62 enqueue(oopDesc::decode_heap_oop_not_null(heap_oop)); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
63 } |
342 | 64 } |
65 } | |
66 | |
12343 | 67 bool G1SATBCardTableModRefBS::mark_card_deferred(size_t card_index) { |
68 jbyte val = _byte_map[card_index]; | |
69 // It's already processed | |
70 if ((val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val()) { | |
71 return false; | |
72 } | |
12835
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
73 |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
74 if (val == g1_young_gen) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
75 // the card is for a young gen region. We don't need to keep track of all pointers into young |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
76 return false; |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
77 } |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
78 |
12343 | 79 // Cached bit can be installed either on a clean card or on a claimed card. |
80 jbyte new_val = val; | |
81 if (val == clean_card_val()) { | |
82 new_val = (jbyte)deferred_card_val(); | |
83 } else { | |
84 if (val & claimed_card_val()) { | |
85 new_val = val | (jbyte)deferred_card_val(); | |
86 } | |
87 } | |
88 if (new_val != val) { | |
89 Atomic::cmpxchg(new_val, &_byte_map[card_index], val); | |
90 } | |
91 return true; | |
92 } | |
93 | |
12835
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
94 void G1SATBCardTableModRefBS::g1_mark_as_young(const MemRegion& mr) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
95 jbyte *const first = byte_for(mr.start()); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
96 jbyte *const last = byte_after(mr.last()); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
97 |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
98 memset(first, g1_young_gen, last - first); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
99 } |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
100 |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
101 #ifndef PRODUCT |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
102 void G1SATBCardTableModRefBS::verify_g1_young_region(MemRegion mr) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
103 verify_region(mr, g1_young_gen, true); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
104 } |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
105 #endif |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
106 |
342 | 107 G1SATBCardTableLoggingModRefBS:: |
108 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap, | |
109 int max_covered_regions) : | |
110 G1SATBCardTableModRefBS(whole_heap, max_covered_regions), | |
111 _dcqs(JavaThread::dirty_card_queue_set()) | |
112 { | |
113 _kind = G1SATBCTLogging; | |
114 } | |
115 | |
116 void | |
117 G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field, | |
14443
3205e78d8193
8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents:
12840
diff
changeset
|
118 oop new_val, |
3205e78d8193
8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents:
12840
diff
changeset
|
119 bool release) { |
12835
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
120 volatile jbyte* byte = byte_for(field); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
121 if (*byte == g1_young_gen) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
122 return; |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
123 } |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
124 OrderAccess::storeload(); |
342 | 125 if (*byte != dirty_card) { |
126 *byte = dirty_card; | |
127 Thread* thr = Thread::current(); | |
128 if (thr->is_Java_thread()) { | |
129 JavaThread* jt = (JavaThread*)thr; | |
130 jt->dirty_card_queue().enqueue(byte); | |
131 } else { | |
132 MutexLockerEx x(Shared_DirtyCardQ_lock, | |
133 Mutex::_no_safepoint_check_flag); | |
134 _dcqs.shared_dirty_card_queue()->enqueue(byte); | |
135 } | |
136 } | |
137 } | |
138 | |
139 void | |
140 G1SATBCardTableLoggingModRefBS::write_ref_field_static(void* field, | |
141 oop new_val) { | |
142 uintptr_t field_uint = (uintptr_t)field; | |
12316
190899198332
7195622: CheckUnhandledOops has limited usefulness now
hseigel
parents:
11068
diff
changeset
|
143 uintptr_t new_val_uint = cast_from_oop<uintptr_t>(new_val); |
342 | 144 uintptr_t comb = field_uint ^ new_val_uint; |
145 comb = comb >> HeapRegion::LogOfHRGrainBytes; | |
146 if (comb == 0) return; | |
147 if (new_val == NULL) return; | |
148 // Otherwise, log it. | |
149 G1SATBCardTableLoggingModRefBS* g1_bs = | |
150 (G1SATBCardTableLoggingModRefBS*)Universe::heap()->barrier_set(); | |
151 g1_bs->write_ref_field_work(field, new_val); | |
152 } | |
153 | |
154 void | |
155 G1SATBCardTableLoggingModRefBS::invalidate(MemRegion mr, bool whole_heap) { | |
12835
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
156 volatile jbyte* byte = byte_for(mr.start()); |
342 | 157 jbyte* last_byte = byte_for(mr.last()); |
158 Thread* thr = Thread::current(); | |
159 if (whole_heap) { | |
160 while (byte <= last_byte) { | |
161 *byte = dirty_card; | |
162 byte++; | |
163 } | |
164 } else { | |
12835
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
165 // skip all consecutive young cards |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
166 for (; byte <= last_byte && *byte == g1_young_gen; byte++); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
167 |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
168 if (byte <= last_byte) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
169 OrderAccess::storeload(); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
170 // Enqueue if necessary. |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
171 if (thr->is_Java_thread()) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
172 JavaThread* jt = (JavaThread*)thr; |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
173 for (; byte <= last_byte; byte++) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
174 if (*byte == g1_young_gen) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
175 continue; |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
176 } |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
177 if (*byte != dirty_card) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
178 *byte = dirty_card; |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
179 jt->dirty_card_queue().enqueue(byte); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
180 } |
342 | 181 } |
12835
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
182 } else { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
183 MutexLockerEx x(Shared_DirtyCardQ_lock, |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
184 Mutex::_no_safepoint_check_flag); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
185 for (; byte <= last_byte; byte++) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
186 if (*byte == g1_young_gen) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
187 continue; |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
188 } |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
189 if (*byte != dirty_card) { |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
190 *byte = dirty_card; |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
191 _dcqs.shared_dirty_card_queue()->enqueue(byte); |
69944b868a32
8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents:
12343
diff
changeset
|
192 } |
342 | 193 } |
194 } | |
195 } | |
196 } | |
197 } |