Mercurial > hg > graal-jvmci-8
annotate src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp @ 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 | c49dcaf78a65 |
children | b0c374311c4e |
rev | line source |
---|---|
342 | 1 /* |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17805
diff
changeset
|
2 * Copyright (c) 2001, 2014, 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:
1261
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1261
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:
1261
diff
changeset
|
21 * questions. |
342 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP |
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP | |
27 | |
3771 | 28 #include "gc_implementation/g1/concurrentMark.inline.hpp" |
1972 | 29 #include "gc_implementation/g1/g1CollectedHeap.hpp" |
30 #include "gc_implementation/g1/g1OopClosures.hpp" | |
31 #include "gc_implementation/g1/g1RemSet.hpp" | |
14391 | 32 #include "gc_implementation/g1/g1RemSet.inline.hpp" |
6251
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
33 #include "gc_implementation/g1/heapRegionRemSet.hpp" |
20198
c49dcaf78a65
8042737: Introduce umbrella header prefetch.inline.hpp
goetz
parents:
17937
diff
changeset
|
34 #include "runtime/prefetch.inline.hpp" |
1972 | 35 |
342 | 36 /* |
37 * This really ought to be an inline function, but apparently the C++ | |
38 * compiler sometimes sees fit to ignore inline declarations. Sigh. | |
39 */ | |
40 | |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
41 template <class T> |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
42 inline void FilterIntoCSClosure::do_oop_nv(T* p) { |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
43 T heap_oop = oopDesc::load_heap_oop(p); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
44 if (!oopDesc::is_null(heap_oop) && |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
45 _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop))) { |
342 | 46 _oc->do_oop(p); |
47 } | |
48 } | |
49 | |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
50 template <class T> |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
51 inline void FilterOutOfRegionClosure::do_oop_nv(T* p) { |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
52 T heap_oop = oopDesc::load_heap_oop(p); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
53 if (!oopDesc::is_null(heap_oop)) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
54 HeapWord* obj_hw = (HeapWord*)oopDesc::decode_heap_oop_not_null(heap_oop); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
55 if (obj_hw < _r_bottom || obj_hw >= _r_end) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
56 _oc->do_oop(p); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
57 } |
342 | 58 } |
59 } | |
60 | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
61 // This closure is applied to the fields of the objects that have just been copied. |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
62 template <class T> |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
63 inline void G1ParScanClosure::do_oop_nv(T* p) { |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
64 T heap_oop = oopDesc::load_heap_oop(p); |
342 | 65 |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
66 if (!oopDesc::is_null(heap_oop)) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
67 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
68 if (_g1->in_cset_fast_test(obj)) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
69 // We're not going to even bother checking whether the object is |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
70 // already forwarded or not, as this usually causes an immediate |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
71 // stall. We'll try to prefetch the object (for write, given that |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
72 // we might need to install the forwarding reference) and we'll |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
73 // get back to it when pop it from the queue |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
74 Prefetch::write(obj->mark_addr(), 0); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
75 Prefetch::read(obj->mark_addr(), (HeapWordSize*2)); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
76 |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
77 // slightly paranoid test; I'm trying to catch potential |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
78 // problems before we go into push_on_queue to know where the |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
79 // problem is coming from |
4126
4406629aa157
7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents:
3771
diff
changeset
|
80 assert((obj == oopDesc::load_decode_heap_oop(p)) || |
4406629aa157
7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents:
3771
diff
changeset
|
81 (obj->is_forwarded() && |
4406629aa157
7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents:
3771
diff
changeset
|
82 obj->forwardee() == oopDesc::load_decode_heap_oop(p)), |
4406629aa157
7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents:
3771
diff
changeset
|
83 "p should still be pointing to obj or to its forwardee"); |
4406629aa157
7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents:
3771
diff
changeset
|
84 |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
85 _par_scan_state->push_on_queue(p); |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
86 } else { |
17687
86b64209f715
8027559: Decrease code size and templatizing in G1ParCopyClosure::do_oop_work
tschatzl
parents:
6862
diff
changeset
|
87 _par_scan_state->update_rs(_from, p, _worker_id); |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
342
diff
changeset
|
88 } |
342 | 89 } |
90 } | |
1261 | 91 |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
92 template <class T> |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
93 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) { |
1261 | 94 T heap_oop = oopDesc::load_heap_oop(p); |
95 | |
96 if (!oopDesc::is_null(heap_oop)) { | |
97 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); | |
98 if (_g1->in_cset_fast_test(obj)) { | |
99 Prefetch::write(obj->mark_addr(), 0); | |
100 Prefetch::read(obj->mark_addr(), (HeapWordSize*2)); | |
1705 | 101 |
102 // Place on the references queue | |
1261 | 103 _par_scan_state->push_on_queue(p); |
104 } | |
105 } | |
106 } | |
1705 | 107 |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
108 template <class T> |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
109 inline void G1CMOopClosure::do_oop_nv(T* p) { |
3771 | 110 assert(_g1h->is_in_g1_reserved((HeapWord*) p), "invariant"); |
111 assert(!_g1h->is_on_master_free_list( | |
112 _g1h->heap_region_containing((HeapWord*) p)), "invariant"); | |
113 | |
114 oop obj = oopDesc::load_decode_heap_oop(p); | |
115 if (_cm->verbose_high()) { | |
6862
8a5ea0a9ccc4
7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents:
6254
diff
changeset
|
116 gclog_or_tty->print_cr("[%u] we're looking at location " |
3771 | 117 "*"PTR_FORMAT" = "PTR_FORMAT, |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
17805
diff
changeset
|
118 _task->worker_id(), p2i(p), p2i((void*) obj)); |
3771 | 119 } |
120 _task->deal_with_reference(obj); | |
121 } | |
1972 | 122 |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
123 template <class T> |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
124 inline void G1RootRegionScanClosure::do_oop_nv(T* p) { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
125 T heap_oop = oopDesc::load_heap_oop(p); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
126 if (!oopDesc::is_null(heap_oop)) { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
127 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
128 HeapRegion* hr = _g1h->heap_region_containing((HeapWord*) obj); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
129 if (hr != NULL) { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
130 _cm->grayRoot(obj, obj->size(), _worker_id, hr); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
131 } |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
132 } |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
133 } |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4126
diff
changeset
|
134 |
4839 | 135 template <class T> |
136 inline void G1Mux2Closure::do_oop_nv(T* p) { | |
137 // Apply first closure; then apply the second. | |
138 _c1->do_oop(p); | |
139 _c2->do_oop(p); | |
140 } | |
141 | |
142 template <class T> | |
143 inline void G1TriggerClosure::do_oop_nv(T* p) { | |
144 // Record that this closure was actually applied (triggered). | |
145 _triggered = true; | |
146 } | |
147 | |
148 template <class T> | |
149 inline void G1InvokeIfNotTriggeredClosure::do_oop_nv(T* p) { | |
150 if (!_trigger_cl->triggered()) { | |
151 _oop_cl->do_oop(p); | |
152 } | |
153 } | |
154 | |
155 template <class T> | |
156 inline void G1UpdateRSOrPushRefOopClosure::do_oop_nv(T* p) { | |
157 oop obj = oopDesc::load_decode_heap_oop(p); | |
158 #ifdef ASSERT | |
159 // can't do because of races | |
160 // assert(obj == NULL || obj->is_oop(), "expected an oop"); | |
161 | |
162 // Do the safe subset of is_oop | |
163 if (obj != NULL) { | |
164 #ifdef CHECK_UNHANDLED_OOPS | |
165 oopDesc* o = obj.obj(); | |
166 #else | |
167 oopDesc* o = obj; | |
168 #endif // CHECK_UNHANDLED_OOPS | |
169 assert((intptr_t)o % MinObjAlignmentInBytes == 0, "not oop aligned"); | |
170 assert(Universe::heap()->is_in_reserved(obj), "must be in heap"); | |
171 } | |
172 #endif // ASSERT | |
173 | |
174 assert(_from != NULL, "from region must be non-NULL"); | |
6251
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
175 assert(_from->is_in_reserved(p), "p is not in from"); |
4839 | 176 |
177 HeapRegion* to = _g1->heap_region_containing(obj); | |
178 if (to != NULL && _from != to) { | |
179 // The _record_refs_into_cset flag is true during the RSet | |
180 // updating part of an evacuation pause. It is false at all | |
181 // other times: | |
182 // * rebuilding the rembered sets after a full GC | |
183 // * during concurrent refinement. | |
184 // * updating the remembered sets of regions in the collection | |
185 // set in the event of an evacuation failure (when deferred | |
186 // updates are enabled). | |
187 | |
188 if (_record_refs_into_cset && to->in_collection_set()) { | |
189 // We are recording references that point into the collection | |
190 // set and this particular reference does exactly that... | |
191 // If the referenced object has already been forwarded | |
192 // to itself, we are handling an evacuation failure and | |
193 // we have already visited/tried to copy this object | |
194 // there is no need to retry. | |
195 if (!self_forwarded(obj)) { | |
196 assert(_push_ref_cl != NULL, "should not be null"); | |
197 // Push the reference in the refs queue of the G1ParScanThreadState | |
198 // instance for this worker thread. | |
199 _push_ref_cl->do_oop(p); | |
200 } | |
201 | |
202 // Deferred updates to the CSet are either discarded (in the normal case), | |
203 // or processed (if an evacuation failure occurs) at the end | |
204 // of the collection. | |
205 // See G1RemSet::cleanup_after_oops_into_collection_set_do(). | |
6251
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
206 return; |
4839 | 207 } |
6251
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
208 |
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
209 // We either don't care about pushing references that point into the |
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
210 // collection set (i.e. we're not during an evacuation pause) _or_ |
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
211 // the reference doesn't point into the collection set. Either way |
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
212 // we add the reference directly to the RSet of the region containing |
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
213 // the referenced object. |
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
214 assert(to->rem_set() != NULL, "Need per-region 'into' remsets."); |
594dff5e3c2e
7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents:
4839
diff
changeset
|
215 to->rem_set()->add_reference(p, _worker_i); |
4839 | 216 } |
217 } | |
218 | |
1972 | 219 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP |