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
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 /*
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
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: 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
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: 1705
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
27
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
28 #include "gc_implementation/g1/concurrentMark.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
29 #include "gc_implementation/g1/g1CollectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
30 #include "gc_implementation/g1/g1OopClosures.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
31 #include "gc_implementation/g1/g1RemSet.hpp"
14391
d2907f74462e 8016586: PPC64 (part 3): basic changes for PPC64
goetz
parents: 6862
diff changeset
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
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
35
342
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 * This really ought to be an inline function, but apparently the C++
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
38 * compiler sometimes sees fit to ignore inline declarations. Sigh.
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
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 _oc->do_oop(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
58 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
59 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
90 }
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
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
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
94 T heap_oop = oopDesc::load_heap_oop(p);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
95
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
96 if (!oopDesc::is_null(heap_oop)) {
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
97 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
98 if (_g1->in_cset_fast_test(obj)) {
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
99 Prefetch::write(obj->mark_addr(), 0);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
100 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
101
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
102 // Place on the references queue
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
103 _par_scan_state->push_on_queue(p);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
104 }
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
105 }
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
106 }
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
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
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
110 assert(_g1h->is_in_g1_reserved((HeapWord*) p), "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
111 assert(!_g1h->is_on_master_free_list(
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
112 _g1h->heap_region_containing((HeapWord*) p)), "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
113
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
114 oop obj = oopDesc::load_decode_heap_oop(p);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
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
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
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
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
119 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
120 _task->deal_with_reference(obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
121 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
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
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
135 template <class T>
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
136 inline void G1Mux2Closure::do_oop_nv(T* p) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
137 // Apply first closure; then apply the second.
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
138 _c1->do_oop(p);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
139 _c2->do_oop(p);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
140 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
141
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
142 template <class T>
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
143 inline void G1TriggerClosure::do_oop_nv(T* p) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
144 // Record that this closure was actually applied (triggered).
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
145 _triggered = true;
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
146 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
147
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
148 template <class T>
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
149 inline void G1InvokeIfNotTriggeredClosure::do_oop_nv(T* p) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
150 if (!_trigger_cl->triggered()) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
151 _oop_cl->do_oop(p);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
152 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
153 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
154
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
155 template <class T>
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
156 inline void G1UpdateRSOrPushRefOopClosure::do_oop_nv(T* p) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
157 oop obj = oopDesc::load_decode_heap_oop(p);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
158 #ifdef ASSERT
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
159 // can't do because of races
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
160 // assert(obj == NULL || obj->is_oop(), "expected an oop");
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
161
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
162 // Do the safe subset of is_oop
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
163 if (obj != NULL) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
164 #ifdef CHECK_UNHANDLED_OOPS
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
165 oopDesc* o = obj.obj();
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
166 #else
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
167 oopDesc* o = obj;
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
168 #endif // CHECK_UNHANDLED_OOPS
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
169 assert((intptr_t)o % MinObjAlignmentInBytes == 0, "not oop aligned");
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
170 assert(Universe::heap()->is_in_reserved(obj), "must be in heap");
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
171 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
172 #endif // ASSERT
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
173
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
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
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
176
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
177 HeapRegion* to = _g1->heap_region_containing(obj);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
178 if (to != NULL && _from != to) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
179 // The _record_refs_into_cset flag is true during the RSet
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
180 // updating part of an evacuation pause. It is false at all
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
181 // other times:
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
182 // * rebuilding the rembered sets after a full GC
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
183 // * during concurrent refinement.
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
184 // * updating the remembered sets of regions in the collection
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
185 // set in the event of an evacuation failure (when deferred
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
186 // updates are enabled).
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
187
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
188 if (_record_refs_into_cset && to->in_collection_set()) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
189 // We are recording references that point into the collection
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
190 // set and this particular reference does exactly that...
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
191 // If the referenced object has already been forwarded
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
192 // to itself, we are handling an evacuation failure and
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
193 // we have already visited/tried to copy this object
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
194 // there is no need to retry.
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
195 if (!self_forwarded(obj)) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
196 assert(_push_ref_cl != NULL, "should not be null");
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
197 // Push the reference in the refs queue of the G1ParScanThreadState
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
198 // instance for this worker thread.
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
199 _push_ref_cl->do_oop(p);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
200 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
201
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
202 // Deferred updates to the CSet are either discarded (in the normal case),
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
203 // or processed (if an evacuation failure occurs) at the end
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
204 // of the collection.
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
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
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
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
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
216 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
217 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
218
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
219 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP