annotate src/share/vm/oops/arrayKlassKlass.cpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents a61af66fc99e
children 4e6abf09f540
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_arrayKlassKlass.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 klassOop arrayKlassKlass::create_klass(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
30 arrayKlassKlass o;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 KlassHandle h_this_klass(THREAD, Universe::klassKlassObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
32 KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // Make sure size calculation is right
a61af66fc99e Initial load
duke
parents:
diff changeset
34 assert(k()->size() == align_object_size(header_size()), "wrong size for object");
a61af66fc99e Initial load
duke
parents:
diff changeset
35 java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror, make links
a61af66fc99e Initial load
duke
parents:
diff changeset
36 return k();
a61af66fc99e Initial load
duke
parents:
diff changeset
37 }
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 bool arrayKlassKlass::oop_is_parsable(oop obj) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
40 assert(obj->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
41 arrayKlass* ak = arrayKlass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
42 return (!ak->null_vtbl()) && ak->object_is_parsable();
a61af66fc99e Initial load
duke
parents:
diff changeset
43 }
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 void arrayKlassKlass::oop_follow_contents(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 assert(obj->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
47 arrayKlass* ak = arrayKlass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
48 MarkSweep::mark_and_push(ak->adr_component_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
49 MarkSweep::mark_and_push(ak->adr_lower_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
50 MarkSweep::mark_and_push(ak->adr_higher_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
51 {
a61af66fc99e Initial load
duke
parents:
diff changeset
52 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 ak->vtable()->oop_follow_contents();
a61af66fc99e Initial load
duke
parents:
diff changeset
54 }
a61af66fc99e Initial load
duke
parents:
diff changeset
55 klassKlass::oop_follow_contents(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
59 void arrayKlassKlass::oop_follow_contents(ParCompactionManager* cm,
a61af66fc99e Initial load
duke
parents:
diff changeset
60 oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
61 assert(obj->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
62 arrayKlass* ak = arrayKlass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
63 PSParallelCompact::mark_and_push(cm, ak->adr_component_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
64 PSParallelCompact::mark_and_push(cm, ak->adr_lower_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
65 PSParallelCompact::mark_and_push(cm, ak->adr_higher_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
66 {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 ak->vtable()->oop_follow_contents(cm);
a61af66fc99e Initial load
duke
parents:
diff changeset
69 }
a61af66fc99e Initial load
duke
parents:
diff changeset
70 klassKlass::oop_follow_contents(cm, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 int arrayKlassKlass::oop_adjust_pointers(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
76 assert(obj->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
77 arrayKlass* ak = arrayKlass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
78 MarkSweep::adjust_pointer(ak->adr_component_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
79 MarkSweep::adjust_pointer(ak->adr_lower_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
80 MarkSweep::adjust_pointer(ak->adr_higher_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
81 {
a61af66fc99e Initial load
duke
parents:
diff changeset
82 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 ak->vtable()->oop_adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
84 }
a61af66fc99e Initial load
duke
parents:
diff changeset
85 return klassKlass::oop_adjust_pointers(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 int arrayKlassKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 assert(obj->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
91 arrayKlass* ak = arrayKlass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
92 blk->do_oop(ak->adr_component_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
93 blk->do_oop(ak->adr_lower_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
94 blk->do_oop(ak->adr_higher_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
95 ak->vtable()->oop_oop_iterate(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
96 return klassKlass::oop_oop_iterate(obj, blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
97 }
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 int arrayKlassKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 assert(obj->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
102 arrayKlass* ak = arrayKlass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
103 blk->do_oop(ak->adr_component_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
104 blk->do_oop(ak->adr_lower_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
105 blk->do_oop(ak->adr_higher_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
106 ak->vtable()->oop_oop_iterate_m(blk, mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 return klassKlass::oop_oop_iterate_m(obj, blk, mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
111 void arrayKlassKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 assert(obj->blueprint()->oop_is_arrayKlass(),"must be an array klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 void arrayKlassKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 assert(obj->blueprint()->oop_is_arrayKlass(),"must be an array klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 int arrayKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
120 assert(obj->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
121 arrayKlass* ak = arrayKlass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
122 PSParallelCompact::adjust_pointer(ak->adr_component_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
123 PSParallelCompact::adjust_pointer(ak->adr_lower_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
124 PSParallelCompact::adjust_pointer(ak->adr_higher_dimension());
a61af66fc99e Initial load
duke
parents:
diff changeset
125 {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 ak->vtable()->oop_update_pointers(cm);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 return klassKlass::oop_update_pointers(cm, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 int
a61af66fc99e Initial load
duke
parents:
diff changeset
133 arrayKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
134 HeapWord* beg_addr, HeapWord* end_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 assert(obj->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
136 arrayKlass* ak = arrayKlass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 oop* p;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 p = ak->adr_component_mirror();
a61af66fc99e Initial load
duke
parents:
diff changeset
140 PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 p = ak->adr_lower_dimension();
a61af66fc99e Initial load
duke
parents:
diff changeset
142 PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 p = ak->adr_higher_dimension();
a61af66fc99e Initial load
duke
parents:
diff changeset
144 PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 {
a61af66fc99e Initial load
duke
parents:
diff changeset
147 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 ak->vtable()->oop_update_pointers(cm, beg_addr, end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
150 return klassKlass::oop_update_pointers(cm, obj, beg_addr, end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 void arrayKlassKlass::oop_print_on(oop obj, outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
159 assert(obj->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
160 klassKlass::oop_print_on(obj, st);
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 void arrayKlassKlass::oop_print_value_on(oop obj, outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 assert(obj->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
166 arrayKlass* ak = arrayKlass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
167 for(int index = 0; index < ak->dimension(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 st->print("[]");
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
171 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 const char* arrayKlassKlass::internal_name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 return "{array class}";
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 void arrayKlassKlass::oop_verify_on(oop obj, outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 klassKlass::oop_verify_on(obj, st);
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 arrayKlass* ak = arrayKlass::cast(klassOop(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
182 if (!obj->partially_loaded()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 if (ak->component_mirror() != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
184 guarantee(ak->component_mirror()->klass(), "should have a class");
a61af66fc99e Initial load
duke
parents:
diff changeset
185 if (ak->lower_dimension() != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
186 guarantee(ak->lower_dimension()->klass(), "should have a class");
a61af66fc99e Initial load
duke
parents:
diff changeset
187 if (ak->higher_dimension() != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
188 guarantee(ak->higher_dimension()->klass(), "should have a class");
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }