1 /*
2 * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
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 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_GC_G1_G1OOPCLOSURES_INLINE_HPP
26 #define SHARE_VM_GC_G1_G1OOPCLOSURES_INLINE_HPP
27
28 #include "gc/g1/g1CollectedHeap.hpp"
29 #include "gc/g1/g1ConcurrentMark.inline.hpp"
30 #include "gc/g1/g1OopClosures.hpp"
31 #include "gc/g1/g1ParScanThreadState.inline.hpp"
32 #include "gc/g1/g1RemSet.hpp"
33 #include "gc/g1/heapRegion.inline.hpp"
34 #include "gc/g1/heapRegionRemSet.hpp"
35 #include "memory/iterator.inline.hpp"
36 #include "oops/access.inline.hpp"
37 #include "runtime/prefetch.inline.hpp"
38
39 template <class T>
40 inline void G1ScanClosureBase::prefetch_and_push(T* p, const oop obj) {
41 // We're not going to even bother checking whether the object is
42 // already forwarded or not, as this usually causes an immediate
43 // stall. We'll try to prefetch the object (for write, given that
44 // we might need to install the forwarding reference) and we'll
45 // get back to it when pop it from the queue
46 Prefetch::write(obj->mark_addr(), 0);
47 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
48
49 // slightly paranoid test; I'm trying to catch potential
50 // problems before we go into push_on_queue to know where the
51 // problem is coming from
52 assert((obj == oopDesc::load_decode_heap_oop(p)) ||
53 (obj->is_forwarded() &&
54 obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
55 "p should still be pointing to obj or to its forwardee");
56
57 _par_scan_state->push_on_queue(p);
58 }
59
60 template <class T>
61 inline void G1ScanClosureBase::handle_non_cset_obj_common(InCSetState const state, T* p, oop const obj) {
62 if (state.is_humongous()) {
63 _g1->set_humongous_is_live(obj);
64 }
65 }
66
67 template <class T>
215
216 _cm->mark_in_next_bitmap(to_obj);
217 }
218
219 template <G1Barrier barrier, G1Mark do_mark_object>
220 template <class T>
221 void G1ParCopyClosure<barrier, do_mark_object>::do_oop_work(T* p) {
222 T heap_oop = oopDesc::load_heap_oop(p);
223
224 if (oopDesc::is_null(heap_oop)) {
225 return;
226 }
227
228 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
229
230 assert(_worker_id == _par_scan_state->worker_id(), "sanity");
231
232 const InCSetState state = _g1->in_cset_state(obj);
233 if (state.is_in_cset()) {
234 oop forwardee;
235 markOop m = obj->mark();
236 if (m->is_marked()) {
237 forwardee = (oop) m->decode_pointer();
238 } else {
239 forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m);
240 }
241 assert(forwardee != NULL, "forwardee should not be NULL");
242 oopDesc::encode_store_heap_oop(p, forwardee);
243 if (do_mark_object != G1MarkNone && forwardee != obj) {
244 // If the object is self-forwarded we don't need to explicitly
245 // mark it, the evacuation failure protocol will do so.
246 mark_forwarded_object(obj, forwardee);
247 }
248
249 if (barrier == G1BarrierCLD) {
250 do_cld_barrier(forwardee);
251 }
252 } else {
253 if (state.is_humongous()) {
254 _g1->set_humongous_is_live(obj);
255 }
|
1 /*
2 * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
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 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_GC_G1_G1OOPCLOSURES_INLINE_HPP
26 #define SHARE_VM_GC_G1_G1OOPCLOSURES_INLINE_HPP
27
28 #include "gc/g1/g1CollectedHeap.hpp"
29 #include "gc/g1/g1ConcurrentMark.inline.hpp"
30 #include "gc/g1/g1OopClosures.hpp"
31 #include "gc/g1/g1ParScanThreadState.inline.hpp"
32 #include "gc/g1/g1RemSet.hpp"
33 #include "gc/g1/heapRegion.inline.hpp"
34 #include "gc/g1/heapRegionRemSet.hpp"
35 #include "memory/iterator.inline.hpp"
36 #include "oops/access.inline.hpp"
37 #include "oops/oop.inline.hpp"
38 #include "runtime/prefetch.inline.hpp"
39
40 template <class T>
41 inline void G1ScanClosureBase::prefetch_and_push(T* p, const oop obj) {
42 // We're not going to even bother checking whether the object is
43 // already forwarded or not, as this usually causes an immediate
44 // stall. We'll try to prefetch the object (for write, given that
45 // we might need to install the forwarding reference) and we'll
46 // get back to it when pop it from the queue
47 Prefetch::write(obj->mark_addr_raw(), 0);
48 Prefetch::read(obj->mark_addr_raw(), (HeapWordSize*2));
49
50 // slightly paranoid test; I'm trying to catch potential
51 // problems before we go into push_on_queue to know where the
52 // problem is coming from
53 assert((obj == oopDesc::load_decode_heap_oop(p)) ||
54 (obj->is_forwarded() &&
55 obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
56 "p should still be pointing to obj or to its forwardee");
57
58 _par_scan_state->push_on_queue(p);
59 }
60
61 template <class T>
62 inline void G1ScanClosureBase::handle_non_cset_obj_common(InCSetState const state, T* p, oop const obj) {
63 if (state.is_humongous()) {
64 _g1->set_humongous_is_live(obj);
65 }
66 }
67
68 template <class T>
216
217 _cm->mark_in_next_bitmap(to_obj);
218 }
219
220 template <G1Barrier barrier, G1Mark do_mark_object>
221 template <class T>
222 void G1ParCopyClosure<barrier, do_mark_object>::do_oop_work(T* p) {
223 T heap_oop = oopDesc::load_heap_oop(p);
224
225 if (oopDesc::is_null(heap_oop)) {
226 return;
227 }
228
229 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
230
231 assert(_worker_id == _par_scan_state->worker_id(), "sanity");
232
233 const InCSetState state = _g1->in_cset_state(obj);
234 if (state.is_in_cset()) {
235 oop forwardee;
236 markOop m = obj->mark_raw();
237 if (m->is_marked()) {
238 forwardee = (oop) m->decode_pointer();
239 } else {
240 forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m);
241 }
242 assert(forwardee != NULL, "forwardee should not be NULL");
243 oopDesc::encode_store_heap_oop(p, forwardee);
244 if (do_mark_object != G1MarkNone && forwardee != obj) {
245 // If the object is self-forwarded we don't need to explicitly
246 // mark it, the evacuation failure protocol will do so.
247 mark_forwarded_object(obj, forwardee);
248 }
249
250 if (barrier == G1BarrierCLD) {
251 do_cld_barrier(forwardee);
252 }
253 } else {
254 if (state.is_humongous()) {
255 _g1->set_humongous_is_live(obj);
256 }
|