annotate src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp @ 20211:82693fb204a5

8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet Summary: The test incorrectly assumed that it had been started with no other previous compilation activity. Fix this by allowing multiple code root free chunk lists, and use one separate from the global one to perform the test. Reviewed-by: brutisso
author tschatzl
date Wed, 16 Apr 2014 10:14:50 +0200
parents ce8f6bb717c9
children e5035defa3c4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1 /*
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
7 * published by the Free Software Foundation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
8 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
13 * accompanied this code).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
14 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
22 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
23 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "gc_implementation/g1/heapRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "gc_implementation/g1/satbQueue.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "runtime/mutexLocker.hpp"
20197
ce8f6bb717c9 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 17951
diff changeset
30 #include "runtime/orderAccess.inline.hpp"
7180
f34d701e952e 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 3960
diff changeset
31 #include "runtime/thread.inline.hpp"
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
32
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
33 G1SATBCardTableModRefBS::G1SATBCardTableModRefBS(MemRegion whole_heap,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
34 int max_covered_regions) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35 CardTableModRefBSForCTRS(whole_heap, max_covered_regions)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
36 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
37 _kind = G1SATBCT;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
38 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
39
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
40
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41 void G1SATBCardTableModRefBS::enqueue(oop pre_val) {
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 1972
diff changeset
42 // Nulls should have been already filtered.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 1972
diff changeset
43 assert(pre_val->is_oop(true), "Error");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 1972
diff changeset
44
1317
d4197f8d516a 6935821: G1: threads created during marking do not active their SATB queues
tonyp
parents: 845
diff changeset
45 if (!JavaThread::satb_mark_queue_set().is_active()) return;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 Thread* thr = Thread::current();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 if (thr->is_Java_thread()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48 JavaThread* jt = (JavaThread*)thr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
49 jt->satb_mark_queue().enqueue(pre_val);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
50 } else {
11068
b30744960351 8014022: G1: Non Java threads should lock the shared SATB queue lock without safepoint checks.
brutisso
parents: 7180
diff changeset
51 MutexLockerEx x(Shared_SATB_Q_lock, Mutex::_no_safepoint_check_flag);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52 JavaThread::satb_mark_queue_set().shared_satb_queue()->enqueue(pre_val);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
54 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
55
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
56 template <class T> void
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
57 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
58 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
59 T* elem_ptr = dst;
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
60 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
61 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
62 if (!oopDesc::is_null(heap_oop)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
63 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
64 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
65 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
68 bool G1SATBCardTableModRefBS::mark_card_deferred(size_t card_index) {
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
69 jbyte val = _byte_map[card_index];
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
70 // It's already processed
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
71 if ((val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val()) {
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
72 return false;
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
73 }
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
74
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
75 if (val == g1_young_gen) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
76 // 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
77 return false;
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
78 }
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
79
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
80 // Cached bit can be installed either on a clean card or on a claimed card.
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
81 jbyte new_val = val;
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
82 if (val == clean_card_val()) {
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
83 new_val = (jbyte)deferred_card_val();
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
84 } else {
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
85 if (val & claimed_card_val()) {
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
86 new_val = val | (jbyte)deferred_card_val();
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
87 }
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
88 }
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
89 if (new_val != val) {
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
90 Atomic::cmpxchg(new_val, &_byte_map[card_index], val);
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
91 }
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
92 return true;
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
93 }
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 11068
diff changeset
94
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
95 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
96 jbyte *const first = byte_for(mr.start());
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
97 jbyte *const last = byte_after(mr.last());
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
98
17951
6a0ad2977919 8039042: G1: Phantom zeros in cardtable
pliden
parents: 14443
diff changeset
99 // Below we may use an explicit loop instead of memset() because on
6a0ad2977919 8039042: G1: Phantom zeros in cardtable
pliden
parents: 14443
diff changeset
100 // certain platforms memset() can give concurrent readers phantom zeros.
6a0ad2977919 8039042: G1: Phantom zeros in cardtable
pliden
parents: 14443
diff changeset
101 if (UseMemSetInBOT) {
6a0ad2977919 8039042: G1: Phantom zeros in cardtable
pliden
parents: 14443
diff changeset
102 memset(first, g1_young_gen, last - first);
6a0ad2977919 8039042: G1: Phantom zeros in cardtable
pliden
parents: 14443
diff changeset
103 } else {
6a0ad2977919 8039042: G1: Phantom zeros in cardtable
pliden
parents: 14443
diff changeset
104 for (jbyte* i = first; i < last; i++) {
6a0ad2977919 8039042: G1: Phantom zeros in cardtable
pliden
parents: 14443
diff changeset
105 *i = g1_young_gen;
6a0ad2977919 8039042: G1: Phantom zeros in cardtable
pliden
parents: 14443
diff changeset
106 }
6a0ad2977919 8039042: G1: Phantom zeros in cardtable
pliden
parents: 14443
diff changeset
107 }
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
108 }
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
109
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
110 #ifndef PRODUCT
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
111 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
112 verify_region(mr, g1_young_gen, true);
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
113 }
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
114 #endif
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
115
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
116 G1SATBCardTableLoggingModRefBS::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
117 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
118 int max_covered_regions) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
119 G1SATBCardTableModRefBS(whole_heap, max_covered_regions),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
120 _dcqs(JavaThread::dirty_card_queue_set())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
121 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
122 _kind = G1SATBCTLogging;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
123 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
124
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
125 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
126 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
127 oop new_val,
3205e78d8193 8029396: PPC64 (part 212): Several memory ordering fixes in C-code.
goetz
parents: 12840
diff changeset
128 bool release) {
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
129 volatile jbyte* byte = byte_for(field);
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
130 if (*byte == g1_young_gen) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
131 return;
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
132 }
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
133 OrderAccess::storeload();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
134 if (*byte != dirty_card) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
135 *byte = dirty_card;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136 Thread* thr = Thread::current();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
137 if (thr->is_Java_thread()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138 JavaThread* jt = (JavaThread*)thr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
139 jt->dirty_card_queue().enqueue(byte);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
141 MutexLockerEx x(Shared_DirtyCardQ_lock,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 Mutex::_no_safepoint_check_flag);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143 _dcqs.shared_dirty_card_queue()->enqueue(byte);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
144 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
149 G1SATBCardTableLoggingModRefBS::write_ref_field_static(void* field,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
150 oop new_val) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
151 uintptr_t field_uint = (uintptr_t)field;
12316
190899198332 7195622: CheckUnhandledOops has limited usefulness now
hseigel
parents: 11068
diff changeset
152 uintptr_t new_val_uint = cast_from_oop<uintptr_t>(new_val);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
153 uintptr_t comb = field_uint ^ new_val_uint;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154 comb = comb >> HeapRegion::LogOfHRGrainBytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
155 if (comb == 0) return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
156 if (new_val == NULL) return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
157 // Otherwise, log it.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
158 G1SATBCardTableLoggingModRefBS* g1_bs =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
159 (G1SATBCardTableLoggingModRefBS*)Universe::heap()->barrier_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
160 g1_bs->write_ref_field_work(field, new_val);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
161 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
162
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
163 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
164 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
165 volatile jbyte* byte = byte_for(mr.start());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
166 jbyte* last_byte = byte_for(mr.last());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
167 Thread* thr = Thread::current();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
168 if (whole_heap) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
169 while (byte <= last_byte) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
170 *byte = dirty_card;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
171 byte++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
172 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
173 } else {
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
174 // skip all consecutive young cards
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
175 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
176
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
177 if (byte <= last_byte) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
178 OrderAccess::storeload();
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
179 // Enqueue if necessary.
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
180 if (thr->is_Java_thread()) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
181 JavaThread* jt = (JavaThread*)thr;
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
182 for (; byte <= last_byte; byte++) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
183 if (*byte == g1_young_gen) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
184 continue;
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
185 }
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
186 if (*byte != dirty_card) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
187 *byte = dirty_card;
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
188 jt->dirty_card_queue().enqueue(byte);
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
189 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
190 }
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
191 } else {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
192 MutexLockerEx x(Shared_DirtyCardQ_lock,
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
193 Mutex::_no_safepoint_check_flag);
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
194 for (; byte <= last_byte; byte++) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
195 if (*byte == g1_young_gen) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
196 continue;
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
197 }
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
198 if (*byte != dirty_card) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
199 *byte = dirty_card;
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
200 _dcqs.shared_dirty_card_queue()->enqueue(byte);
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12343
diff changeset
201 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
205 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206 }