Mercurial > hg > truffle
annotate src/share/vm/oops/instanceRefKlass.cpp @ 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 | aed758eda82a |
children | db9981fd3124 |
rev | line source |
---|---|
0 | 1 /* |
6008 | 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
0 | 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:
1144
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1144
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:
1144
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/javaClasses.hpp" | |
27 #include "classfile/systemDictionary.hpp" | |
28 #include "gc_implementation/shared/markSweep.inline.hpp" | |
29 #include "gc_interface/collectedHeap.hpp" | |
30 #include "gc_interface/collectedHeap.inline.hpp" | |
31 #include "memory/genCollectedHeap.hpp" | |
32 #include "memory/genOopClosures.inline.hpp" | |
33 #include "oops/instanceRefKlass.hpp" | |
34 #include "oops/oop.inline.hpp" | |
35 #include "utilities/preserveException.hpp" | |
36 #ifndef SERIALGC | |
37 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" | |
38 #include "gc_implementation/g1/g1OopClosures.inline.hpp" | |
39 #include "gc_implementation/g1/g1RemSet.inline.hpp" | |
40 #include "gc_implementation/g1/heapRegionSeq.inline.hpp" | |
41 #include "gc_implementation/parNew/parOopClosures.inline.hpp" | |
42 #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp" | |
43 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp" | |
44 #include "oops/oop.pcgc.inline.hpp" | |
45 #endif | |
0 | 46 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
47 template <class T> |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
48 void specialized_oop_follow_contents(InstanceRefKlass* ref, oop obj) { |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
49 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
50 T heap_oop = oopDesc::load_heap_oop(referent_addr); |
0 | 51 debug_only( |
52 if(TraceReferenceGC && PrintGCDetails) { | |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
53 gclog_or_tty->print_cr("InstanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj); |
0 | 54 } |
55 ) | |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
56 if (!oopDesc::is_null(heap_oop)) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
57 oop referent = oopDesc::decode_heap_oop_not_null(heap_oop); |
0 | 58 if (!referent->is_gc_marked() && |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
59 MarkSweep::ref_processor()->discover_reference(obj, ref->reference_type())) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
60 // reference was discovered, referent will be traversed later |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
61 ref->InstanceKlass::oop_follow_contents(obj); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
62 debug_only( |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
63 if(TraceReferenceGC && PrintGCDetails) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
64 gclog_or_tty->print_cr(" Non NULL enqueued " INTPTR_FORMAT, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
65 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
66 ) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
67 return; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
68 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
69 // treat referent as normal oop |
0 | 70 debug_only( |
71 if(TraceReferenceGC && PrintGCDetails) { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
72 gclog_or_tty->print_cr(" Non NULL normal " INTPTR_FORMAT, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
73 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
74 ) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
75 MarkSweep::mark_and_push(referent_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
76 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
77 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
78 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
79 if (ReferenceProcessor::pending_list_uses_discovered_field()) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
80 // Treat discovered as normal oop, if ref is not "active", |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
81 // i.e. if next is non-NULL. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
82 T next_oop = oopDesc::load_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
83 if (!oopDesc::is_null(next_oop)) { // i.e. ref is not "active" |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
84 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
85 debug_only( |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
86 if(TraceReferenceGC && PrintGCDetails) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
87 gclog_or_tty->print_cr(" Process discovered as normal " |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
88 INTPTR_FORMAT, discovered_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
89 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
90 ) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
91 MarkSweep::mark_and_push(discovered_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
92 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
93 } else { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
94 #ifdef ASSERT |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
95 // In the case of older JDKs which do not use the discovered |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
96 // field for the pending list, an inactive ref (next != NULL) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
97 // must always have a NULL discovered field. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
98 oop next = oopDesc::load_decode_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
99 oop discovered = java_lang_ref_Reference::discovered(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
100 assert(oopDesc::is_null(next) || oopDesc::is_null(discovered), |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
101 err_msg("Found an inactive reference " PTR_FORMAT " with a non-NULL discovered field", |
3929
f94227b6117b
7090259: Fix hotspot sources to build with old compilers
kvn
parents:
3917
diff
changeset
|
102 (oopDesc*)obj)); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
103 #endif |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
104 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
105 // treat next as normal oop. next is a link in the reference queue. |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
106 debug_only( |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
107 if(TraceReferenceGC && PrintGCDetails) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
108 gclog_or_tty->print_cr(" Process next as normal " INTPTR_FORMAT, next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
109 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
110 ) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
111 MarkSweep::mark_and_push(next_addr); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
112 ref->InstanceKlass::oop_follow_contents(obj); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
113 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
114 |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
115 void InstanceRefKlass::oop_follow_contents(oop obj) { |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
116 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
117 specialized_oop_follow_contents<narrowOop>(this, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
118 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
119 specialized_oop_follow_contents<oop>(this, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
120 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
121 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
122 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
123 #ifndef SERIALGC |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
124 template <class T> |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
125 void specialized_oop_follow_contents(InstanceRefKlass* ref, |
1123
167c2986d91b
6843629: Make current hotspot build part of jdk5 control build
phh
parents:
948
diff
changeset
|
126 ParCompactionManager* cm, |
167c2986d91b
6843629: Make current hotspot build part of jdk5 control build
phh
parents:
948
diff
changeset
|
127 oop obj) { |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
128 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
129 T heap_oop = oopDesc::load_heap_oop(referent_addr); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
130 debug_only( |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
131 if(TraceReferenceGC && PrintGCDetails) { |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
132 gclog_or_tty->print_cr("InstanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
133 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
134 ) |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
135 if (!oopDesc::is_null(heap_oop)) { |
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
136 oop referent = oopDesc::decode_heap_oop_not_null(heap_oop); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
137 if (PSParallelCompact::mark_bitmap()->is_unmarked(referent) && |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
138 PSParallelCompact::ref_processor()-> |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
139 discover_reference(obj, ref->reference_type())) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
140 // reference already enqueued, referent will be traversed later |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
141 ref->InstanceKlass::oop_follow_contents(cm, obj); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
142 debug_only( |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
143 if(TraceReferenceGC && PrintGCDetails) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
144 gclog_or_tty->print_cr(" Non NULL enqueued " INTPTR_FORMAT, obj); |
0 | 145 } |
146 ) | |
147 return; | |
148 } else { | |
149 // treat referent as normal oop | |
150 debug_only( | |
151 if(TraceReferenceGC && PrintGCDetails) { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
152 gclog_or_tty->print_cr(" Non NULL normal " INTPTR_FORMAT, obj); |
0 | 153 } |
154 ) | |
155 PSParallelCompact::mark_and_push(cm, referent_addr); | |
156 } | |
157 } | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
158 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
159 if (ReferenceProcessor::pending_list_uses_discovered_field()) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
160 // Treat discovered as normal oop, if ref is not "active", |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
161 // i.e. if next is non-NULL. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
162 T next_oop = oopDesc::load_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
163 if (!oopDesc::is_null(next_oop)) { // i.e. ref is not "active" |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
164 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
165 debug_only( |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
166 if(TraceReferenceGC && PrintGCDetails) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
167 gclog_or_tty->print_cr(" Process discovered as normal " |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
168 INTPTR_FORMAT, discovered_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
169 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
170 ) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
171 PSParallelCompact::mark_and_push(cm, discovered_addr); |
0 | 172 } |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
173 } else { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
174 #ifdef ASSERT |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
175 // In the case of older JDKs which do not use the discovered |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
176 // field for the pending list, an inactive ref (next != NULL) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
177 // must always have a NULL discovered field. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
178 T next = oopDesc::load_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
179 oop discovered = java_lang_ref_Reference::discovered(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
180 assert(oopDesc::is_null(next) || oopDesc::is_null(discovered), |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
181 err_msg("Found an inactive reference " PTR_FORMAT " with a non-NULL discovered field", |
3929
f94227b6117b
7090259: Fix hotspot sources to build with old compilers
kvn
parents:
3917
diff
changeset
|
182 (oopDesc*)obj)); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
183 #endif |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
184 } |
0 | 185 PSParallelCompact::mark_and_push(cm, next_addr); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
186 ref->InstanceKlass::oop_follow_contents(cm, obj); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
187 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
188 |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
189 void InstanceRefKlass::oop_follow_contents(ParCompactionManager* cm, |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
190 oop obj) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
191 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
192 specialized_oop_follow_contents<narrowOop>(this, cm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
193 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
194 specialized_oop_follow_contents<oop>(this, cm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
195 } |
0 | 196 } |
197 #endif // SERIALGC | |
198 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
199 #ifdef ASSERT |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
200 template <class T> void trace_reference_gc(const char *s, oop obj, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
201 T* referent_addr, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
202 T* next_addr, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
203 T* discovered_addr) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
204 if(TraceReferenceGC && PrintGCDetails) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
205 gclog_or_tty->print_cr("%s obj " INTPTR_FORMAT, s, (address)obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
206 gclog_or_tty->print_cr(" referent_addr/* " INTPTR_FORMAT " / " |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
207 INTPTR_FORMAT, referent_addr, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
208 referent_addr ? |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
209 (address)oopDesc::load_decode_heap_oop(referent_addr) : NULL); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
210 gclog_or_tty->print_cr(" next_addr/* " INTPTR_FORMAT " / " |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
211 INTPTR_FORMAT, next_addr, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
212 next_addr ? (address)oopDesc::load_decode_heap_oop(next_addr) : NULL); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
213 gclog_or_tty->print_cr(" discovered_addr/* " INTPTR_FORMAT " / " |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
214 INTPTR_FORMAT, discovered_addr, |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
215 discovered_addr ? |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
216 (address)oopDesc::load_decode_heap_oop(discovered_addr) : NULL); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
217 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
218 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
219 #endif |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
220 |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
221 template <class T> void specialized_oop_adjust_pointers(InstanceRefKlass *ref, oop obj) { |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
222 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
223 MarkSweep::adjust_pointer(referent_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
224 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
225 MarkSweep::adjust_pointer(next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
226 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
227 MarkSweep::adjust_pointer(discovered_addr); |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
228 debug_only(trace_reference_gc("InstanceRefKlass::oop_adjust_pointers", obj, |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
229 referent_addr, next_addr, discovered_addr);) |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
230 } |
0 | 231 |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
232 int InstanceRefKlass::oop_adjust_pointers(oop obj) { |
0 | 233 int size = size_helper(); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
234 InstanceKlass::oop_adjust_pointers(obj); |
0 | 235 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
236 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
237 specialized_oop_adjust_pointers<narrowOop>(this, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
238 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
239 specialized_oop_adjust_pointers<oop>(this, obj); |
0 | 240 } |
241 return size; | |
242 } | |
243 | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
244 #define InstanceRefKlass_SPECIALIZED_OOP_ITERATE(T, nv_suffix, contains) \ |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
245 T* disc_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); \ |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
246 if (closure->apply_to_weak_ref_discovered_field()) { \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
247 closure->do_oop##nv_suffix(disc_addr); \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
248 } \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
249 \ |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
250 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); \ |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
251 T heap_oop = oopDesc::load_heap_oop(referent_addr); \ |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
252 ReferenceProcessor* rp = closure->_ref_processor; \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
253 if (!oopDesc::is_null(heap_oop)) { \ |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
356
diff
changeset
|
254 oop referent = oopDesc::decode_heap_oop_not_null(heap_oop); \ |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
255 if (!referent->is_gc_marked() && (rp != NULL) && \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
256 rp->discover_reference(obj, reference_type())) { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
257 return size; \ |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
258 } else if (contains(referent_addr)) { \ |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
259 /* treat referent as normal oop */ \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
260 SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk);\ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
261 closure->do_oop##nv_suffix(referent_addr); \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
262 } \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
263 } \ |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
264 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
265 if (ReferenceProcessor::pending_list_uses_discovered_field()) { \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
266 T next_oop = oopDesc::load_heap_oop(next_addr); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
267 /* Treat discovered as normal oop, if ref is not "active" (next non-NULL) */\ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
268 if (!oopDesc::is_null(next_oop) && contains(disc_addr)) { \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
269 /* i.e. ref is not "active" */ \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
270 debug_only( \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
271 if(TraceReferenceGC && PrintGCDetails) { \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
272 gclog_or_tty->print_cr(" Process discovered as normal " \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
273 INTPTR_FORMAT, disc_addr); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
274 } \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
275 ) \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
276 SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk);\ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
277 closure->do_oop##nv_suffix(disc_addr); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
278 } \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
279 } else { \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
280 /* In the case of older JDKs which do not use the discovered field for */ \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
281 /* the pending list, an inactive ref (next != NULL) must always have a */ \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
282 /* NULL discovered field. */ \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
283 debug_only( \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
284 T next_oop = oopDesc::load_heap_oop(next_addr); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
285 T disc_oop = oopDesc::load_heap_oop(disc_addr); \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
286 assert(oopDesc::is_null(next_oop) || oopDesc::is_null(disc_oop), \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
287 err_msg("Found an inactive reference " PTR_FORMAT " with a non-NULL" \ |
3929
f94227b6117b
7090259: Fix hotspot sources to build with old compilers
kvn
parents:
3917
diff
changeset
|
288 "discovered field", (oopDesc*)obj)); \ |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
289 ) \ |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
290 } \ |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
291 /* treat next as normal oop */ \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
292 if (contains(next_addr)) { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
293 SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::irk); \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
294 closure->do_oop##nv_suffix(next_addr); \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
295 } \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
296 return size; \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
297 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
298 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
299 template <class T> bool contains(T *t) { return true; } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
300 |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
301 // Macro to define InstanceRefKlass::oop_oop_iterate for virtual/nonvirtual for |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
302 // all closures. Macros calling macros above for each oop size. |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
303 |
0 | 304 #define InstanceRefKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \ |
305 \ | |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
306 int InstanceRefKlass:: \ |
0 | 307 oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \ |
308 /* Get size before changing pointers */ \ | |
309 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ | |
310 \ | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
311 int size = InstanceKlass::oop_oop_iterate##nv_suffix(obj, closure); \ |
0 | 312 \ |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
313 if (UseCompressedOops) { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
314 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(narrowOop, nv_suffix, contains); \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
315 } else { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
316 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, contains); \ |
0 | 317 } \ |
318 } | |
319 | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
320 #ifndef SERIALGC |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
321 #define InstanceRefKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
322 \ |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
323 int InstanceRefKlass:: \ |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
324 oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* closure) { \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
325 /* Get size before changing pointers */ \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
326 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
327 \ |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
328 int size = InstanceKlass::oop_oop_iterate_backwards##nv_suffix(obj, closure); \ |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
329 \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
330 if (UseCompressedOops) { \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
331 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(narrowOop, nv_suffix, contains); \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
332 } else { \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
333 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, contains); \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
334 } \ |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
335 } |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
336 #endif // !SERIALGC |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
337 |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
338 |
0 | 339 #define InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \ |
340 \ | |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
341 int InstanceRefKlass:: \ |
0 | 342 oop_oop_iterate##nv_suffix##_m(oop obj, \ |
343 OopClosureType* closure, \ | |
344 MemRegion mr) { \ | |
345 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::irk);\ | |
346 \ | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
347 int size = InstanceKlass::oop_oop_iterate##nv_suffix##_m(obj, closure, mr); \ |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
348 if (UseCompressedOops) { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
349 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(narrowOop, nv_suffix, mr.contains); \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
350 } else { \ |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
351 InstanceRefKlass_SPECIALIZED_OOP_ITERATE(oop, nv_suffix, mr.contains); \ |
0 | 352 } \ |
353 } | |
354 | |
355 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN) | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
356 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_DEFN) |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
357 #ifndef SERIALGC |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
358 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN) |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
359 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN) |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
360 #endif // SERIALGC |
0 | 361 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m) |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
362 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m) |
0 | 363 |
364 #ifndef SERIALGC | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
365 template <class T> |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
366 void specialized_oop_push_contents(InstanceRefKlass *ref, |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
367 PSPromotionManager* pm, oop obj) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
368 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
369 if (PSScavenge::should_scavenge(referent_addr)) { |
0 | 370 ReferenceProcessor* rp = PSScavenge::reference_processor(); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
371 if (rp->discover_reference(obj, ref->reference_type())) { |
0 | 372 // reference already enqueued, referent and next will be traversed later |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
373 ref->InstanceKlass::oop_push_contents(pm, obj); |
0 | 374 return; |
375 } else { | |
376 // treat referent as normal oop | |
377 pm->claim_or_forward_depth(referent_addr); | |
378 } | |
379 } | |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
380 // Treat discovered as normal oop, if ref is not "active", |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
381 // i.e. if next is non-NULL. |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
382 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
383 if (ReferenceProcessor::pending_list_uses_discovered_field()) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
384 T next_oop = oopDesc::load_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
385 if (!oopDesc::is_null(next_oop)) { // i.e. ref is not "active" |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
386 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
387 debug_only( |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
388 if(TraceReferenceGC && PrintGCDetails) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
389 gclog_or_tty->print_cr(" Process discovered as normal " |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
390 INTPTR_FORMAT, discovered_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
391 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
392 ) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
393 if (PSScavenge::should_scavenge(discovered_addr)) { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
394 pm->claim_or_forward_depth(discovered_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
395 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
396 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
397 } else { |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
398 #ifdef ASSERT |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
399 // In the case of older JDKs which do not use the discovered |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
400 // field for the pending list, an inactive ref (next != NULL) |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
401 // must always have a NULL discovered field. |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
402 oop next = oopDesc::load_decode_heap_oop(next_addr); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
403 oop discovered = java_lang_ref_Reference::discovered(obj); |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
404 assert(oopDesc::is_null(next) || oopDesc::is_null(discovered), |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
405 err_msg("Found an inactive reference " PTR_FORMAT " with a non-NULL discovered field", |
3929
f94227b6117b
7090259: Fix hotspot sources to build with old compilers
kvn
parents:
3917
diff
changeset
|
406 (oopDesc*)obj)); |
3917
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
407 #endif |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
408 } |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
409 |
eca1193ca245
4965777: GC changes to support use of discovered field for pending references
ysr
parents:
3377
diff
changeset
|
410 // Treat next as normal oop; next is a link in the reference queue. |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
411 if (PSScavenge::should_scavenge(next_addr)) { |
0 | 412 pm->claim_or_forward_depth(next_addr); |
413 } | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
414 ref->InstanceKlass::oop_push_contents(pm, obj); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
415 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
416 |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
417 void InstanceRefKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
418 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
419 specialized_oop_push_contents<narrowOop>(this, pm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
420 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
421 specialized_oop_push_contents<oop>(this, pm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
422 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
423 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
424 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
425 template <class T> |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
426 void specialized_oop_update_pointers(InstanceRefKlass *ref, |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
427 ParCompactionManager* cm, oop obj) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
428 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
429 PSParallelCompact::adjust_pointer(referent_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
430 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
431 PSParallelCompact::adjust_pointer(next_addr); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
432 T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
433 PSParallelCompact::adjust_pointer(discovered_addr); |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
434 debug_only(trace_reference_gc("InstanceRefKlass::oop_update_ptrs", obj, |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
435 referent_addr, next_addr, discovered_addr);) |
0 | 436 } |
437 | |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
438 int InstanceRefKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
439 InstanceKlass::oop_update_pointers(cm, obj); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
440 if (UseCompressedOops) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
441 specialized_oop_update_pointers<narrowOop>(this, cm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
442 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
443 specialized_oop_update_pointers<oop>(this, cm, obj); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
444 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
445 return size_helper(); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
446 } |
0 | 447 #endif // SERIALGC |
448 | |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
449 void InstanceRefKlass::update_nonstatic_oop_maps(Klass* k) { |
0 | 450 // Clear the nonstatic oop-map entries corresponding to referent |
451 // and nextPending field. They are treated specially by the | |
452 // garbage collector. | |
453 // The discovered field is used only by the garbage collector | |
454 // and is also treated specially. | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
455 InstanceKlass* ik = InstanceKlass::cast(k); |
0 | 456 |
457 // Check that we have the right class | |
458 debug_only(static bool first_time = true); | |
1142 | 459 assert(k == SystemDictionary::Reference_klass() && first_time, |
0 | 460 "Invalid update of maps"); |
461 debug_only(first_time = false); | |
938 | 462 assert(ik->nonstatic_oop_map_count() == 1, "just checking"); |
0 | 463 |
464 OopMapBlock* map = ik->start_of_nonstatic_oop_maps(); | |
465 | |
466 // Check that the current map is (2,4) - currently points at field with | |
467 // offset 2 (words) and has 4 map entries. | |
468 debug_only(int offset = java_lang_ref_Reference::referent_offset); | |
939
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
469 debug_only(unsigned int count = ((java_lang_ref_Reference::discovered_offset - |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
470 java_lang_ref_Reference::referent_offset)/heapOopSize) + 1); |
0 | 471 |
472 if (UseSharedSpaces) { | |
473 assert(map->offset() == java_lang_ref_Reference::queue_offset && | |
938 | 474 map->count() == 1, "just checking"); |
0 | 475 } else { |
938 | 476 assert(map->offset() == offset && map->count() == count, |
0 | 477 "just checking"); |
478 | |
479 // Update map to (3,1) - point to offset of 3 (words) with 1 map entry. | |
480 map->set_offset(java_lang_ref_Reference::queue_offset); | |
938 | 481 map->set_count(1); |
0 | 482 } |
483 } | |
484 | |
485 | |
486 // Verification | |
487 | |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
488 void InstanceRefKlass::oop_verify_on(oop obj, outputStream* st) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6108
diff
changeset
|
489 InstanceKlass::oop_verify_on(obj, st); |
0 | 490 // Verify referent field |
491 oop referent = java_lang_ref_Reference::referent(obj); | |
492 | |
493 // We should make this general to all heaps | |
494 GenCollectedHeap* gch = NULL; | |
495 if (Universe::heap()->kind() == CollectedHeap::GenCollectedHeap) | |
496 gch = GenCollectedHeap::heap(); | |
497 | |
498 if (referent != NULL) { | |
499 guarantee(referent->is_oop(), "referent field heap failed"); | |
500 } | |
501 // Verify next field | |
502 oop next = java_lang_ref_Reference::next(obj); | |
503 if (next != NULL) { | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
113
diff
changeset
|
504 guarantee(next->is_oop(), "next field verify failed"); |
0 | 505 guarantee(next->is_instanceRef(), "next field verify failed"); |
506 } | |
507 } | |
508 | |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
509 bool InstanceRefKlass::owns_pending_list_lock(JavaThread* thread) { |
2025
b03e6b4c7c75
7006471: fix for 6988439 crashes when pending list lock is null
coleenp
parents:
2021
diff
changeset
|
510 if (java_lang_ref_Reference::pending_list_lock() == NULL) return false; |
2021
7cf1a74771e8
6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents:
1972
diff
changeset
|
511 Handle h_lock(thread, java_lang_ref_Reference::pending_list_lock()); |
7cf1a74771e8
6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents:
1972
diff
changeset
|
512 return ObjectSynchronizer::current_thread_holds_lock(thread, h_lock); |
7cf1a74771e8
6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents:
1972
diff
changeset
|
513 } |
7cf1a74771e8
6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents:
1972
diff
changeset
|
514 |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
515 void InstanceRefKlass::acquire_pending_list_lock(BasicLock *pending_list_basic_lock) { |
0 | 516 // we may enter this with pending exception set |
517 PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument | |
6108
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
518 |
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
519 // Create a HandleMark in case we retry a GC multiple times. |
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
520 // Each time we attempt the GC, we allocate the handle below |
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
521 // to hold the pending list lock. We want to free this handle. |
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
522 HandleMark hm; |
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
523 |
0 | 524 Handle h_lock(THREAD, java_lang_ref_Reference::pending_list_lock()); |
525 ObjectSynchronizer::fast_enter(h_lock, pending_list_basic_lock, false, THREAD); | |
526 assert(ObjectSynchronizer::current_thread_holds_lock( | |
527 JavaThread::current(), h_lock), | |
528 "Locking should have succeeded"); | |
529 if (HAS_PENDING_EXCEPTION) CLEAR_PENDING_EXCEPTION; | |
530 } | |
531 | |
6735
aed758eda82a
7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents:
6725
diff
changeset
|
532 void InstanceRefKlass::release_and_notify_pending_list_lock( |
0 | 533 BasicLock *pending_list_basic_lock) { |
534 // we may enter this with pending exception set | |
535 PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument | |
6108
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
536 |
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
537 // Create a HandleMark in case we retry a GC multiple times. |
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
538 // Each time we attempt the GC, we allocate the handle below |
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
539 // to hold the pending list lock. We want to free this handle. |
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
540 HandleMark hm; |
c52a6a39546c
7158682: G1: Handle leak when running nsk.sysdict tests
johnc
parents:
6008
diff
changeset
|
541 |
0 | 542 Handle h_lock(THREAD, java_lang_ref_Reference::pending_list_lock()); |
543 assert(ObjectSynchronizer::current_thread_holds_lock( | |
544 JavaThread::current(), h_lock), | |
545 "Lock should be held"); | |
546 // Notify waiters on pending lists lock if there is any reference. | |
547 if (java_lang_ref_Reference::pending_list() != NULL) { | |
548 ObjectSynchronizer::notifyall(h_lock, THREAD); | |
549 } | |
550 ObjectSynchronizer::fast_exit(h_lock(), pending_list_basic_lock, THREAD); | |
551 if (HAS_PENDING_EXCEPTION) CLEAR_PENDING_EXCEPTION; | |
552 } |