annotate src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents a2f7274eb6ef
children 63a4eb8bcd23 d2907f74462e 86b64209f715
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 /*
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
2 * Copyright (c) 2001, 2012, 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"
6251
594dff5e3c2e 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 4839
diff changeset
32 #include "gc_implementation/g1/heapRegionRemSet.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
33
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
34 /*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35 * 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
36 * compiler sometimes sees fit to ignore inline declarations. Sigh.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
37 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
38
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
39 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
40 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
41 T heap_oop = oopDesc::load_heap_oop(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
42 if (!oopDesc::is_null(heap_oop) &&
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
43 _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
44 _oc->do_oop(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
48 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
49 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
50 T heap_oop = oopDesc::load_heap_oop(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
51 if (!oopDesc::is_null(heap_oop)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
52 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
53 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
54 _oc->do_oop(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
55 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
58
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
59 // 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
60 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
61 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
62 T heap_oop = oopDesc::load_heap_oop(p);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
63
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
64 if (!oopDesc::is_null(heap_oop)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
65 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
66 if (_g1->in_cset_fast_test(obj)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
67 // 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
68 // 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
69 // 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
70 // 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
71 // 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
72 Prefetch::write(obj->mark_addr(), 0);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
73 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
74
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
75 // 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
76 // 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
77 // 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
78 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
79 (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
80 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
81 "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
82
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
83 _par_scan_state->push_on_queue(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
84 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
85 _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num());
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
86 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
87 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
88 }
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
89
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
90 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
91 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) {
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
92 T heap_oop = oopDesc::load_heap_oop(p);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
93
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
94 if (!oopDesc::is_null(heap_oop)) {
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
95 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
96 if (_g1->in_cset_fast_test(obj)) {
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
97 Prefetch::write(obj->mark_addr(), 0);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
98 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
99
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
100 // Place on the references queue
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
101 _par_scan_state->push_on_queue(p);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
102 }
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
103 }
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
104 }
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
105
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
106 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
107 inline void G1CMOopClosure::do_oop_nv(T* p) {
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
108 assert(_g1h->is_in_g1_reserved((HeapWord*) p), "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
109 assert(!_g1h->is_on_master_free_list(
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
110 _g1h->heap_region_containing((HeapWord*) p)), "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
111
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
112 oop obj = oopDesc::load_decode_heap_oop(p);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
113 if (_cm->verbose_high()) {
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6254
diff changeset
114 gclog_or_tty->print_cr("[%u] we're looking at location "
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
115 "*"PTR_FORMAT" = "PTR_FORMAT,
6862
8a5ea0a9ccc4 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 6254
diff changeset
116 _task->worker_id(), p, (void*) obj);
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
117 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
118 _task->deal_with_reference(obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
119 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
120
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
121 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
122 inline void G1RootRegionScanClosure::do_oop_nv(T* p) {
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
123 T heap_oop = oopDesc::load_heap_oop(p);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
124 if (!oopDesc::is_null(heap_oop)) {
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
125 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
126 HeapRegion* hr = _g1h->heap_region_containing((HeapWord*) obj);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
127 if (hr != NULL) {
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
128 _cm->grayRoot(obj, obj->size(), _worker_id, hr);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
129 }
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
130 }
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
4839
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
133 template <class T>
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
134 inline void G1Mux2Closure::do_oop_nv(T* p) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
135 // Apply first closure; then apply the second.
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
136 _c1->do_oop(p);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
137 _c2->do_oop(p);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
138 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
139
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
140 template <class T>
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
141 inline void G1TriggerClosure::do_oop_nv(T* p) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
142 // Record that this closure was actually applied (triggered).
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
143 _triggered = true;
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
144 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
145
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
146 template <class T>
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
147 inline void G1InvokeIfNotTriggeredClosure::do_oop_nv(T* p) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
148 if (!_trigger_cl->triggered()) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
149 _oop_cl->do_oop(p);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
150 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
151 }
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 template <class T>
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
154 inline void G1UpdateRSOrPushRefOopClosure::do_oop_nv(T* p) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
155 oop obj = oopDesc::load_decode_heap_oop(p);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
156 #ifdef ASSERT
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
157 // can't do because of races
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
158 // assert(obj == NULL || obj->is_oop(), "expected an oop");
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
159
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
160 // Do the safe subset of is_oop
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
161 if (obj != NULL) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
162 #ifdef CHECK_UNHANDLED_OOPS
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
163 oopDesc* o = obj.obj();
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
164 #else
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
165 oopDesc* o = obj;
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
166 #endif // CHECK_UNHANDLED_OOPS
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
167 assert((intptr_t)o % MinObjAlignmentInBytes == 0, "not oop aligned");
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
168 assert(Universe::heap()->is_in_reserved(obj), "must be in heap");
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
169 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
170 #endif // ASSERT
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 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
173 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
174
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
175 HeapRegion* to = _g1->heap_region_containing(obj);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
176 if (to != NULL && _from != to) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
177 // The _record_refs_into_cset flag is true during the RSet
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
178 // updating part of an evacuation pause. It is false at all
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
179 // other times:
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
180 // * rebuilding the rembered sets after a full GC
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
181 // * during concurrent refinement.
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
182 // * updating the remembered sets of regions in the collection
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
183 // set in the event of an evacuation failure (when deferred
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
184 // updates are enabled).
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
185
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
186 if (_record_refs_into_cset && to->in_collection_set()) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
187 // We are recording references that point into the collection
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
188 // set and this particular reference does exactly that...
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
189 // If the referenced object has already been forwarded
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
190 // to itself, we are handling an evacuation failure and
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
191 // we have already visited/tried to copy this object
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
192 // there is no need to retry.
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
193 if (!self_forwarded(obj)) {
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
194 assert(_push_ref_cl != NULL, "should not be null");
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
195 // Push the reference in the refs queue of the G1ParScanThreadState
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
196 // instance for this worker thread.
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
197 _push_ref_cl->do_oop(p);
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
198 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
199
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
200 // 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
201 // or processed (if an evacuation failure occurs) at the end
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
202 // of the collection.
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
203 // 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
204 return;
4839
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
205 }
6251
594dff5e3c2e 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 4839
diff changeset
206
594dff5e3c2e 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 4839
diff changeset
207 // 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
208 // 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
209 // 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
210 // 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
211 // the referenced object.
594dff5e3c2e 7173712: G1: Duplicated code in G1UpdateRSOrPushRefOopClosure::do_oop_nv()
johnc
parents: 4839
diff changeset
212 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
213 to->rem_set()->add_reference(p, _worker_i);
4839
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
214 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
215 }
b4ebad3520bb 7133038: G1: Some small profile based optimizations
johnc
parents: 4837
diff changeset
216
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
217 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP