annotate src/share/vm/prims/jvmtiGetLoadedClasses.cpp @ 12233:40136aa2cdb1

8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
author tschatzl
date Wed, 11 Sep 2013 16:25:02 +0200
parents 070d523b96a7
children e64f1fe9756b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
0
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 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
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: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "prims/jvmtiGetLoadedClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "runtime/thread.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // The closure for GetLoadedClasses and GetClassLoaderClasses
a61af66fc99e Initial load
duke
parents:
diff changeset
34 class JvmtiGetLoadedClassesClosure : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // Since the SystemDictionary::classes_do callback
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // doesn't pass a closureData pointer,
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // we use a thread-local slot to hold a pointer to
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // a stack allocated instance of this structure.
a61af66fc99e Initial load
duke
parents:
diff changeset
39 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
40 jobject _initiatingLoader;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 int _count;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 Handle* _list;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 int _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // Getting and setting the thread local pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
47 static JvmtiGetLoadedClassesClosure* get_this() {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 JvmtiGetLoadedClassesClosure* result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
50 result = thread->get_jvmti_get_loaded_classes_closure();
a61af66fc99e Initial load
duke
parents:
diff changeset
51 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 }
a61af66fc99e Initial load
duke
parents:
diff changeset
53 static void set_this(JvmtiGetLoadedClassesClosure* that) {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
55 thread->set_jvmti_get_loaded_classes_closure(that);
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // Constructor/Destructor
a61af66fc99e Initial load
duke
parents:
diff changeset
60 JvmtiGetLoadedClassesClosure() {
a61af66fc99e Initial load
duke
parents:
diff changeset
61 JvmtiGetLoadedClassesClosure* that = get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
62 assert(that == NULL, "JvmtiGetLoadedClassesClosure in use");
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _initiatingLoader = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 _list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 _index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 set_this(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 JvmtiGetLoadedClassesClosure(jobject initiatingLoader) {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 JvmtiGetLoadedClassesClosure* that = get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
72 assert(that == NULL, "JvmtiGetLoadedClassesClosure in use");
a61af66fc99e Initial load
duke
parents:
diff changeset
73 _initiatingLoader = initiatingLoader;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 _index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 set_this(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 }
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 ~JvmtiGetLoadedClassesClosure() {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 JvmtiGetLoadedClassesClosure* that = get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
82 assert(that != NULL, "JvmtiGetLoadedClassesClosure not found");
a61af66fc99e Initial load
duke
parents:
diff changeset
83 set_this(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 _initiatingLoader = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 if (_list != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 FreeHeap(_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 _list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 _index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // Accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
94 jobject get_initiatingLoader() {
a61af66fc99e Initial load
duke
parents:
diff changeset
95 return _initiatingLoader;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 int get_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 return _count;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void set_count(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 _count = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 Handle* get_list() {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 return _list;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 void set_list(Handle* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 _list = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 int get_index() {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 return _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 void set_index(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
119 _index = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 Handle get_element(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 if ((_list != NULL) && (index < _count)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 return _list[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
125 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 assert(false, "empty get_element");
a61af66fc99e Initial load
duke
parents:
diff changeset
127 return Handle();
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void set_element(int index, Handle value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 if ((_list != NULL) && (index < _count)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 _list[index] = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 assert(false, "bad set_element");
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Other predicates
a61af66fc99e Initial load
duke
parents:
diff changeset
140 bool available() {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 return (_list != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // For debugging.
a61af66fc99e Initial load
duke
parents:
diff changeset
146 void check(int limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
147 for (int i = 0; i < limit; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 assert(Universe::heap()->is_in(get_element(i)()), "check fails");
a61af66fc99e Initial load
duke
parents:
diff changeset
149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Public methods that get called within the scope of the closure
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void allocate() {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
155 _list = NEW_C_HEAP_ARRAY(Handle, _count, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
156 assert(_list != NULL, "Out of memory");
a61af66fc99e Initial load
duke
parents:
diff changeset
157 if (_list == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 void extract(JvmtiEnv *env, jclass* result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 for (int index = 0; index < _count; index += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
164 result[index] = (jclass) env->jni_reference(get_element(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Finally, the static methods that are the callbacks
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
169 static void increment(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
170 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
171 if (that->get_initiatingLoader() == NULL) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
172 for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
173 that->set_count(that->get_count() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 } else if (k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // if initiating loader not null, just include the instance with 1 dimension
a61af66fc99e Initial load
duke
parents:
diff changeset
177 that->set_count(that->get_count() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
181 static void increment_with_loader(Klass* k, ClassLoaderData* loader_data) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
183 oop class_loader = loader_data->class_loader();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
184 if (class_loader == JNIHandles::resolve(that->get_initiatingLoader())) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
185 for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
186 that->set_count(that->get_count() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
191 static void prim_array_increment_with_loader(Klass* array, ClassLoaderData* loader_data) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
192 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
193 oop class_loader = loader_data->class_loader();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
194 if (class_loader == JNIHandles::resolve(that->get_initiatingLoader())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
195 that->set_count(that->get_count() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
199 static void add(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
200 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
201 if (that->available()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 if (that->get_initiatingLoader() == NULL) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
203 for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
204 oop mirror = l->java_mirror();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
205 that->set_element(that->get_index(), mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 that->set_index(that->get_index() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 } else if (k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // if initiating loader not null, just include the instance with 1 dimension
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
210 oop mirror = k->java_mirror();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
211 that->set_element(that->get_index(), mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 that->set_index(that->get_index() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
217 static void add_with_loader(Klass* k, ClassLoaderData* loader_data) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
218 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
219 if (that->available()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
220 oop class_loader = loader_data->class_loader();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
221 if (class_loader == JNIHandles::resolve(that->get_initiatingLoader())) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
222 for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
223 oop mirror = l->java_mirror();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
224 that->set_element(that->get_index(), mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 that->set_index(that->get_index() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // increment the count for the given basic type array class (and any
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // multi-dimensional arrays). For example, for [B we check for
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // [[B, [[[B, .. and the count is incremented for each one that exists.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
234 static void increment_for_basic_type_arrays(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
235 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
236 assert(that != NULL, "no JvmtiGetLoadedClassesClosure");
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
237 for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
238 that->set_count(that->get_count() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // add the basic type array class and its multi-dimensional array classes to the list
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
243 static void add_for_basic_type_arrays(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
244 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 assert(that != NULL, "no JvmtiGetLoadedClassesClosure");
a61af66fc99e Initial load
duke
parents:
diff changeset
246 assert(that->available(), "no list");
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
247 for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
248 oop mirror = l->java_mirror();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 that->set_element(that->get_index(), mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
250 that->set_index(that->get_index() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
253 };
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
257 JvmtiGetLoadedClasses::getLoadedClasses(JvmtiEnv *env, jint* classCountPtr, jclass** classesPtr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // Since SystemDictionary::classes_do only takes a function pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // and doesn't call back with a closure data pointer,
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // we can only pass static methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 JvmtiGetLoadedClassesClosure closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // To get a consistent list of classes we need MultiArray_lock to ensure
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // array classes aren't created, and SystemDictionary_lock to ensure that
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // classes aren't added to the system dictionary,
a61af66fc99e Initial load
duke
parents:
diff changeset
267 MutexLocker ma(MultiArray_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 MutexLocker sd(SystemDictionary_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // First, count the classes
a61af66fc99e Initial load
duke
parents:
diff changeset
271 SystemDictionary::classes_do(&JvmtiGetLoadedClassesClosure::increment);
a61af66fc99e Initial load
duke
parents:
diff changeset
272 Universe::basic_type_classes_do(&JvmtiGetLoadedClassesClosure::increment);
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Next, fill in the classes
a61af66fc99e Initial load
duke
parents:
diff changeset
274 closure.allocate();
a61af66fc99e Initial load
duke
parents:
diff changeset
275 SystemDictionary::classes_do(&JvmtiGetLoadedClassesClosure::add);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 Universe::basic_type_classes_do(&JvmtiGetLoadedClassesClosure::add);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Drop the SystemDictionary_lock, so the results could be wrong from here,
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // but we still have a snapshot.
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // Post results
a61af66fc99e Initial load
duke
parents:
diff changeset
281 jclass* result_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 jvmtiError err = env->Allocate(closure.get_count() * sizeof(jclass),
a61af66fc99e Initial load
duke
parents:
diff changeset
283 (unsigned char**)&result_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
284 if (err != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 closure.extract(env, result_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
288 *classCountPtr = closure.get_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
289 *classesPtr = result_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
290 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
294 JvmtiGetLoadedClasses::getClassLoaderClasses(JvmtiEnv *env, jobject initiatingLoader,
a61af66fc99e Initial load
duke
parents:
diff changeset
295 jint* classCountPtr, jclass** classesPtr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Since SystemDictionary::classes_do only takes a function pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // and doesn't call back with a closure data pointer,
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // we can only pass static methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
299 JvmtiGetLoadedClassesClosure closure(initiatingLoader);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // To get a consistent list of classes we need MultiArray_lock to ensure
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // array classes aren't created, and SystemDictionary_lock to ensure that
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // classes aren't added to the system dictionary,
a61af66fc99e Initial load
duke
parents:
diff changeset
304 MutexLocker ma(MultiArray_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 MutexLocker sd(SystemDictionary_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // First, count the classes in the system dictionary which have this loader recorded
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // as an initiating loader. For basic type arrays this information is not recorded
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // so GetClassLoaderClasses will return all of the basic type arrays. This is okay
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // because the defining loader for basic type arrays is always the boot class loader
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // and these classes are "visible" to all loaders.
a61af66fc99e Initial load
duke
parents:
diff changeset
311 SystemDictionary::classes_do(&JvmtiGetLoadedClassesClosure::increment_with_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
312 Universe::basic_type_classes_do(&JvmtiGetLoadedClassesClosure::increment_for_basic_type_arrays);
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // Next, fill in the classes
a61af66fc99e Initial load
duke
parents:
diff changeset
314 closure.allocate();
a61af66fc99e Initial load
duke
parents:
diff changeset
315 SystemDictionary::classes_do(&JvmtiGetLoadedClassesClosure::add_with_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
316 Universe::basic_type_classes_do(&JvmtiGetLoadedClassesClosure::add_for_basic_type_arrays);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // Drop the SystemDictionary_lock, so the results could be wrong from here,
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // but we still have a snapshot.
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // Post results
a61af66fc99e Initial load
duke
parents:
diff changeset
321 jclass* result_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
322 jvmtiError err = env->Allocate(closure.get_count() * sizeof(jclass),
a61af66fc99e Initial load
duke
parents:
diff changeset
323 (unsigned char**)&result_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
324 if (err != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327 closure.extract(env, result_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 *classCountPtr = closure.get_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
329 *classesPtr = result_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }