annotate src/share/vm/classfile/classLoader.cpp @ 2607:008adfd6d850

Fixed the stateBefore of invokes and monitorenter instructions to include the arguments of the instruction. This is necessary to ensure correct continuation in the interpreter when the stateBefore is used as a deoptimization point.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Fri, 06 May 2011 17:47:17 +0200
parents 0654ee04b214
children 4aa80ca3dbec
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2323
diff changeset
2 * Copyright (c) 1997, 2011, 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: 1188
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1188
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: 1188
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: 1783
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
26 #include "classfile/classFileParser.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
27 #include "classfile/classFileStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
28 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
29 #include "classfile/javaClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
30 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
31 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
32 #include "compiler/compileBroker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
33 #include "gc_interface/collectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
34 #include "interpreter/bytecodeStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
35 #include "interpreter/oopMapCache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
36 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
37 #include "memory/generation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
38 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
39 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
40 #include "oops/constantPoolKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
41 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
42 #include "oops/instanceRefKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
43 #include "oops/oop.inline.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2139
diff changeset
44 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
45 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
46 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
47 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
48 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
49 #include "runtime/handles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
50 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
51 #include "runtime/init.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
52 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
53 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
54 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
55 #include "runtime/threadCritical.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
56 #include "runtime/timer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
57 #include "services/management.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
58 #include "services/threadService.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
59 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
60 #include "utilities/hashtable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
61 #include "utilities/hashtable.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
62 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
63 # include "os_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
64 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
65 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
66 # include "os_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
67 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
68 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
69 # include "os_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
70 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Entry points in zip.dll for loading zip/jar file entries
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 typedef void * * (JNICALL *ZipOpen_t)(const char *name, char **pmsg);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 typedef void (JNICALL *ZipClose_t)(jzfile *zip);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 typedef jzentry* (JNICALL *FindEntry_t)(jzfile *zip, const char *name, jint *sizeP, jint *nameLen);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 typedef jboolean (JNICALL *ReadEntry_t)(jzfile *zip, jzentry *entry, unsigned char *buf, char *namebuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
79 typedef jboolean (JNICALL *ReadMappedEntry_t)(jzfile *zip, jzentry *entry, unsigned char **buf, char *namebuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n);
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 static ZipOpen_t ZipOpen = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 static ZipClose_t ZipClose = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 static FindEntry_t FindEntry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 static ReadEntry_t ReadEntry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 static ReadMappedEntry_t ReadMappedEntry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 static GetNextEntry_t GetNextEntry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 static canonicalize_fn_t CanonicalizeEntry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // Globals
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 PerfCounter* ClassLoader::_perf_accumulated_time = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 PerfCounter* ClassLoader::_perf_classes_inited = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 PerfCounter* ClassLoader::_perf_class_init_time = NULL;
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
95 PerfCounter* ClassLoader::_perf_class_init_selftime = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
96 PerfCounter* ClassLoader::_perf_classes_verified = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97 PerfCounter* ClassLoader::_perf_class_verify_time = NULL;
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
98 PerfCounter* ClassLoader::_perf_class_verify_selftime = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 PerfCounter* ClassLoader::_perf_classes_linked = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 PerfCounter* ClassLoader::_perf_class_link_time = NULL;
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
101 PerfCounter* ClassLoader::_perf_class_link_selftime = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
102 PerfCounter* ClassLoader::_perf_class_parse_time = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
103 PerfCounter* ClassLoader::_perf_class_parse_selftime = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
104 PerfCounter* ClassLoader::_perf_sys_class_lookup_time = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
105 PerfCounter* ClassLoader::_perf_shared_classload_time = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
106 PerfCounter* ClassLoader::_perf_sys_classload_time = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
107 PerfCounter* ClassLoader::_perf_app_classload_time = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
108 PerfCounter* ClassLoader::_perf_app_classload_selftime = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
109 PerfCounter* ClassLoader::_perf_app_classload_count = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
110 PerfCounter* ClassLoader::_perf_define_appclasses = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
111 PerfCounter* ClassLoader::_perf_define_appclass_time = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
112 PerfCounter* ClassLoader::_perf_define_appclass_selftime = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
113 PerfCounter* ClassLoader::_perf_app_classfile_bytes_read = NULL;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
114 PerfCounter* ClassLoader::_perf_sys_classfile_bytes_read = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
115 PerfCounter* ClassLoader::_sync_systemLoaderLockContentionRate = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 PerfCounter* ClassLoader::_sync_nonSystemLoaderLockContentionRate = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 PerfCounter* ClassLoader::_sync_JVMFindLoadedClassLockFreeCounter = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 PerfCounter* ClassLoader::_sync_JVMDefineClassLockFreeCounter = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 PerfCounter* ClassLoader::_sync_JNIDefineClassLockFreeCounter = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 PerfCounter* ClassLoader::_unsafe_defineClassCallCounter = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 PerfCounter* ClassLoader::_isUnsyncloadClass = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 PerfCounter* ClassLoader::_load_instance_class_failCounter = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 ClassPathEntry* ClassLoader::_first_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 ClassPathEntry* ClassLoader::_last_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 PackageHashtable* ClassLoader::_package_hash_table = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // helper routines
a61af66fc99e Initial load
duke
parents:
diff changeset
129 bool string_starts_with(const char* str, const char* str_to_find) {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 size_t str_len = strlen(str);
a61af66fc99e Initial load
duke
parents:
diff changeset
131 size_t str_to_find_len = strlen(str_to_find);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 if (str_to_find_len > str_len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135 return (strncmp(str, str_to_find, str_to_find_len) == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 bool string_ends_with(const char* str, const char* str_to_find) {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 size_t str_len = strlen(str);
a61af66fc99e Initial load
duke
parents:
diff changeset
140 size_t str_to_find_len = strlen(str_to_find);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 if (str_to_find_len > str_len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 return (strncmp(str + (str_len - str_to_find_len), str_to_find, str_to_find_len) == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 MetaIndex::MetaIndex(char** meta_package_names, int num_meta_package_names) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 if (num_meta_package_names == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 _meta_package_names = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 _num_meta_package_names = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
153 _meta_package_names = NEW_C_HEAP_ARRAY(char*, num_meta_package_names);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 _num_meta_package_names = num_meta_package_names;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 memcpy(_meta_package_names, meta_package_names, num_meta_package_names * sizeof(char*));
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 MetaIndex::~MetaIndex() {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 FREE_C_HEAP_ARRAY(char*, _meta_package_names);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 bool MetaIndex::may_contain(const char* class_name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 if ( _num_meta_package_names == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
169 size_t class_name_len = strlen(class_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
170 for (int i = 0; i < _num_meta_package_names; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 char* pkg = _meta_package_names[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
172 size_t pkg_len = strlen(pkg);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 size_t min_len = MIN2(class_name_len, pkg_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 if (!strncmp(class_name, pkg, min_len)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 ClassPathEntry::ClassPathEntry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 set_next(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 bool ClassPathEntry::is_lazy() {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 ClassPathDirEntry::ClassPathDirEntry(char* dir) : ClassPathEntry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 _dir = NEW_C_HEAP_ARRAY(char, strlen(dir)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 strcpy(_dir, dir);
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 ClassFileStream* ClassPathDirEntry::open_stream(const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // construct full path name
a61af66fc99e Initial load
duke
parents:
diff changeset
199 char path[JVM_MAXPATHLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
200 if (jio_snprintf(path, sizeof(path), "%s%s%s", _dir, os::file_separator(), name) == -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // check if file exists
a61af66fc99e Initial load
duke
parents:
diff changeset
204 struct stat st;
a61af66fc99e Initial load
duke
parents:
diff changeset
205 if (os::stat(path, &st) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // found file, open it
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
207 int file_handle = os::open(path, 0, 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
208 if (file_handle != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // read contents into resource array
a61af66fc99e Initial load
duke
parents:
diff changeset
210 u1* buffer = NEW_RESOURCE_ARRAY(u1, st.st_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
211 size_t num_read = os::read(file_handle, (char*) buffer, st.st_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // close file
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
213 os::close(file_handle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // construct ClassFileStream
a61af66fc99e Initial load
duke
parents:
diff changeset
215 if (num_read == (size_t)st.st_size) {
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
216 if (UsePerfData) {
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
217 ClassLoader::perf_sys_classfile_bytes_read()->inc(num_read);
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
218 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return new ClassFileStream(buffer, st.st_size, _dir); // Resource allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name) : ClassPathEntry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 _zip = zip;
a61af66fc99e Initial load
duke
parents:
diff changeset
229 _zip_name = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 strcpy(_zip_name, zip_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 ClassPathZipEntry::~ClassPathZipEntry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 if (ZipClose != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 (*ZipClose)(_zip);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237 FREE_C_HEAP_ARRAY(char, _zip_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 ClassFileStream* ClassPathZipEntry::open_stream(const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // enable call to C land
a61af66fc99e Initial load
duke
parents:
diff changeset
242 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
243 ThreadToNativeFromVM ttn(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // check whether zip archive contains name
a61af66fc99e Initial load
duke
parents:
diff changeset
245 jint filesize, name_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
246 jzentry* entry = (*FindEntry)(_zip, name, &filesize, &name_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
247 if (entry == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
248 u1* buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
249 char name_buf[128];
a61af66fc99e Initial load
duke
parents:
diff changeset
250 char* filename;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 if (name_len < 128) {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 filename = name_buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 filename = NEW_RESOURCE_ARRAY(char, name_len + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // file found, get pointer to class in mmaped jar file.
a61af66fc99e Initial load
duke
parents:
diff changeset
258 if (ReadMappedEntry == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
259 !(*ReadMappedEntry)(_zip, entry, &buffer, filename)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // mmaped access not available, perhaps due to compression,
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // read contents into resource array
a61af66fc99e Initial load
duke
parents:
diff changeset
262 buffer = NEW_RESOURCE_ARRAY(u1, filesize);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 if (!(*ReadEntry)(_zip, entry, buffer, filename)) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
265 if (UsePerfData) {
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
266 ClassLoader::perf_sys_classfile_bytes_read()->inc(filesize);
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
267 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // return result
a61af66fc99e Initial load
duke
parents:
diff changeset
269 return new ClassFileStream(buffer, filesize, _zip_name); // Resource allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // invoke function for each entry in the zip file
a61af66fc99e Initial load
duke
parents:
diff changeset
273 void ClassPathZipEntry::contents_do(void f(const char* name, void* context), void* context) {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
275 HandleMark handle_mark(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 ThreadToNativeFromVM ttn(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 for (int n = 0; ; n++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 jzentry * ze = ((*GetNextEntry)(_zip, n));
a61af66fc99e Initial load
duke
parents:
diff changeset
279 if (ze == NULL) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
280 (*f)(ze->name, context);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 LazyClassPathEntry::LazyClassPathEntry(char* path, struct stat st) : ClassPathEntry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 _path = strdup(path);
a61af66fc99e Initial load
duke
parents:
diff changeset
286 _st = st;
a61af66fc99e Initial load
duke
parents:
diff changeset
287 _meta_index = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 _resolved_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 bool LazyClassPathEntry::is_jar_file() {
a61af66fc99e Initial load
duke
parents:
diff changeset
292 return ((_st.st_mode & S_IFREG) == S_IFREG);
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 ClassPathEntry* LazyClassPathEntry::resolve_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 if (_resolved_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 return (ClassPathEntry*) _resolved_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
299 ClassPathEntry* new_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 ClassLoader::create_class_path_entry(_path, _st, &new_entry, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 assert(new_entry != NULL, "earlier code should have caught this");
a61af66fc99e Initial load
duke
parents:
diff changeset
302 {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 ThreadCritical tc;
a61af66fc99e Initial load
duke
parents:
diff changeset
304 if (_resolved_entry == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
305 _resolved_entry = new_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 return new_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309 assert(_resolved_entry != NULL, "bug in MT-safe resolution logic");
a61af66fc99e Initial load
duke
parents:
diff changeset
310 delete new_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 return (ClassPathEntry*) _resolved_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 ClassFileStream* LazyClassPathEntry::open_stream(const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 if (_meta_index != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
316 !_meta_index->may_contain(name)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319 return resolve_entry()->open_stream(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 bool LazyClassPathEntry::is_lazy() {
a61af66fc99e Initial load
duke
parents:
diff changeset
323 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 static void print_meta_index(LazyClassPathEntry* entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
327 GrowableArray<char*>& meta_packages) {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 tty->print("[Meta index for %s=", entry->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
329 for (int i = 0; i < meta_packages.length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 if (i > 0) tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
331 tty->print(meta_packages.at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
333 tty->print_cr("]");
a61af66fc99e Initial load
duke
parents:
diff changeset
334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 void ClassLoader::setup_meta_index() {
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // Set up meta index which allows us to open boot jars lazily if
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // class data sharing is enabled
a61af66fc99e Initial load
duke
parents:
diff changeset
340 const char* known_version = "% VERSION 2";
a61af66fc99e Initial load
duke
parents:
diff changeset
341 char* meta_index_path = Arguments::get_meta_index_path();
a61af66fc99e Initial load
duke
parents:
diff changeset
342 char* meta_index_dir = Arguments::get_meta_index_dir();
a61af66fc99e Initial load
duke
parents:
diff changeset
343 FILE* file = fopen(meta_index_path, "r");
a61af66fc99e Initial load
duke
parents:
diff changeset
344 int line_no = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
345 if (file != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
346 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
347 LazyClassPathEntry* cur_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
348 GrowableArray<char*> boot_class_path_packages(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 char package_name[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
350 bool skipCurrentJar = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
351 while (fgets(package_name, sizeof(package_name), file) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 ++line_no;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // Remove trailing newline
a61af66fc99e Initial load
duke
parents:
diff changeset
354 package_name[strlen(package_name) - 1] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
355 switch(package_name[0]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
356 case '%':
a61af66fc99e Initial load
duke
parents:
diff changeset
357 {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 if ((line_no == 1) && (strcmp(package_name, known_version) != 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 if (TraceClassLoading && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
360 tty->print("[Unsupported meta index version]");
a61af66fc99e Initial load
duke
parents:
diff changeset
361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
362 fclose(file);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // These directives indicate jar files which contain only
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // classes, only non-classfile resources, or a combination of
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // the two. See src/share/classes/sun/misc/MetaIndex.java and
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // make/tools/MetaIndex/BuildMetaIndex.java in the J2SE
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // workspace.
a61af66fc99e Initial load
duke
parents:
diff changeset
372 case '#':
a61af66fc99e Initial load
duke
parents:
diff changeset
373 case '!':
a61af66fc99e Initial load
duke
parents:
diff changeset
374 case '@':
a61af66fc99e Initial load
duke
parents:
diff changeset
375 {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // Hand off current packages to current lazy entry (if any)
a61af66fc99e Initial load
duke
parents:
diff changeset
377 if ((cur_entry != NULL) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
378 (boot_class_path_packages.length() > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
379 if (TraceClassLoading && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
380 print_meta_index(cur_entry, boot_class_path_packages);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 MetaIndex* index = new MetaIndex(boot_class_path_packages.adr_at(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
383 boot_class_path_packages.length());
a61af66fc99e Initial load
duke
parents:
diff changeset
384 cur_entry->set_meta_index(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
386 cur_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
387 boot_class_path_packages.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // Find lazy entry corresponding to this jar file
a61af66fc99e Initial load
duke
parents:
diff changeset
390 for (ClassPathEntry* entry = _first_entry; entry != NULL; entry = entry->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
391 if (entry->is_lazy() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
392 string_starts_with(entry->name(), meta_index_dir) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
393 string_ends_with(entry->name(), &package_name[2])) {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 cur_entry = (LazyClassPathEntry*) entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
395 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // If the first character is '@', it indicates the following jar
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // file is a resource only jar file in which case, we should skip
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // reading the subsequent entries since the resource loading is
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // totally handled by J2SE side.
a61af66fc99e Initial load
duke
parents:
diff changeset
403 if (package_name[0] == '@') {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 if (cur_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 cur_entry->set_meta_index(new MetaIndex(NULL, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407 cur_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
408 skipCurrentJar = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
409 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 skipCurrentJar = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
417 {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 if (!skipCurrentJar && cur_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
419 char* new_name = strdup(package_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
420 boot_class_path_packages.append(new_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // Hand off current packages to current lazy entry (if any)
a61af66fc99e Initial load
duke
parents:
diff changeset
426 if ((cur_entry != NULL) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
427 (boot_class_path_packages.length() > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 if (TraceClassLoading && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 print_meta_index(cur_entry, boot_class_path_packages);
a61af66fc99e Initial load
duke
parents:
diff changeset
430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
431 MetaIndex* index = new MetaIndex(boot_class_path_packages.adr_at(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
432 boot_class_path_packages.length());
a61af66fc99e Initial load
duke
parents:
diff changeset
433 cur_entry->set_meta_index(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435 fclose(file);
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
438
a61af66fc99e Initial load
duke
parents:
diff changeset
439 void ClassLoader::setup_bootstrap_search_path() {
a61af66fc99e Initial load
duke
parents:
diff changeset
440 assert(_first_entry == NULL, "should not setup bootstrap class search path twice");
a61af66fc99e Initial load
duke
parents:
diff changeset
441 char* sys_class_path = os::strdup(Arguments::get_sysclasspath());
a61af66fc99e Initial load
duke
parents:
diff changeset
442 if (TraceClassLoading && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 tty->print_cr("[Bootstrap loader class path=%s]", sys_class_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 int len = (int)strlen(sys_class_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 int end = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Iterate over class path entries
a61af66fc99e Initial load
duke
parents:
diff changeset
450 for (int start = 0; start < len; start = end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
451 while (sys_class_path[end] && sys_class_path[end] != os::path_separator()[0]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 end++;
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454 char* path = NEW_C_HEAP_ARRAY(char, end-start+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
455 strncpy(path, &sys_class_path[start], end-start);
a61af66fc99e Initial load
duke
parents:
diff changeset
456 path[end-start] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
457 update_class_path_entry_list(path, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 FREE_C_HEAP_ARRAY(char, path);
a61af66fc99e Initial load
duke
parents:
diff changeset
459 while (sys_class_path[end] == os::path_separator()[0]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 end++;
a61af66fc99e Initial load
duke
parents:
diff changeset
461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 void ClassLoader::create_class_path_entry(char *path, struct stat st, ClassPathEntry **new_entry, bool lazy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
466 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
467 if (lazy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 *new_entry = new LazyClassPathEntry(path, st);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
471 if ((st.st_mode & S_IFREG) == S_IFREG) {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // Regular file, should be a zip file
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // Canonicalized filename
a61af66fc99e Initial load
duke
parents:
diff changeset
474 char canonical_path[JVM_MAXPATHLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
475 if (!get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // This matches the classic VM
a61af66fc99e Initial load
duke
parents:
diff changeset
477 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
478 THROW_MSG(vmSymbols::java_io_IOException(), "Bad pathname");
a61af66fc99e Initial load
duke
parents:
diff changeset
479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
480 char* error_msg = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
481 jzfile* zip;
a61af66fc99e Initial load
duke
parents:
diff changeset
482 {
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // enable call to C land
a61af66fc99e Initial load
duke
parents:
diff changeset
484 ThreadToNativeFromVM ttn(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
485 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
486 zip = (*ZipOpen)(canonical_path, &error_msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
488 if (zip != NULL && error_msg == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
489 *new_entry = new ClassPathZipEntry(zip, path);
a61af66fc99e Initial load
duke
parents:
diff changeset
490 if (TraceClassLoading) {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 tty->print_cr("[Opened %s]", path);
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
495 char *msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
496 if (error_msg == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 msg = NEW_RESOURCE_ARRAY(char, strlen(path) + 128); ;
a61af66fc99e Initial load
duke
parents:
diff changeset
498 jio_snprintf(msg, strlen(path) + 127, "error in opening JAR file %s", path);
a61af66fc99e Initial load
duke
parents:
diff changeset
499 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
500 int len = (int)(strlen(path) + strlen(error_msg) + 128);
a61af66fc99e Initial load
duke
parents:
diff changeset
501 msg = NEW_RESOURCE_ARRAY(char, len); ;
a61af66fc99e Initial load
duke
parents:
diff changeset
502 jio_snprintf(msg, len - 1, "error in opening JAR file <%s> %s", error_msg, path);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
504 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 THROW_MSG(vmSymbols::java_lang_ClassNotFoundException(), msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // Directory
a61af66fc99e Initial load
duke
parents:
diff changeset
509 *new_entry = new ClassPathDirEntry(path);
a61af66fc99e Initial load
duke
parents:
diff changeset
510 if (TraceClassLoading) {
a61af66fc99e Initial load
duke
parents:
diff changeset
511 tty->print_cr("[Path %s]", path);
a61af66fc99e Initial load
duke
parents:
diff changeset
512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // Create a class path zip entry for a given path (return NULL if not found
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // or zip/JAR file cannot be opened)
a61af66fc99e Initial load
duke
parents:
diff changeset
519 ClassPathZipEntry* ClassLoader::create_class_path_zip_entry(const char *path) {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // check for a regular file
a61af66fc99e Initial load
duke
parents:
diff changeset
521 struct stat st;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 if (os::stat(path, &st) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
523 if ((st.st_mode & S_IFREG) == S_IFREG) {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 char orig_path[JVM_MAXPATHLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
525 char canonical_path[JVM_MAXPATHLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 strcpy(orig_path, path);
a61af66fc99e Initial load
duke
parents:
diff changeset
528 if (get_canonical_path(orig_path, canonical_path, JVM_MAXPATHLEN)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 char* error_msg = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
530 jzfile* zip;
a61af66fc99e Initial load
duke
parents:
diff changeset
531 {
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // enable call to C land
a61af66fc99e Initial load
duke
parents:
diff changeset
533 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
534 ThreadToNativeFromVM ttn(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
536 zip = (*ZipOpen)(canonical_path, &error_msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
538 if (zip != NULL && error_msg == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // create using canonical path
a61af66fc99e Initial load
duke
parents:
diff changeset
540 return new ClassPathZipEntry(zip, canonical_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // returns true if entry already on class path
a61af66fc99e Initial load
duke
parents:
diff changeset
549 bool ClassLoader::contains_entry(ClassPathEntry *entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 ClassPathEntry* e = _first_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
551 while (e != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // assume zip entries have been canonicalized
a61af66fc99e Initial load
duke
parents:
diff changeset
553 if (strcmp(entry->name(), e->name()) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
554 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 e = e->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
558 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 void ClassLoader::add_to_list(ClassPathEntry *new_entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
562 if (new_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
563 if (_last_entry == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
564 _first_entry = _last_entry = new_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
565 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
566 _last_entry->set_next(new_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
567 _last_entry = new_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 void ClassLoader::update_class_path_entry_list(const char *path,
a61af66fc99e Initial load
duke
parents:
diff changeset
573 bool check_for_duplicates) {
a61af66fc99e Initial load
duke
parents:
diff changeset
574 struct stat st;
a61af66fc99e Initial load
duke
parents:
diff changeset
575 if (os::stat((char *)path, &st) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // File or directory found
a61af66fc99e Initial load
duke
parents:
diff changeset
577 ClassPathEntry* new_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
578 create_class_path_entry((char *)path, st, &new_entry, LazyBootClassLoader);
a61af66fc99e Initial load
duke
parents:
diff changeset
579 // The kernel VM adds dynamically to the end of the classloader path and
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // doesn't reorder the bootclasspath which would break java.lang.Package
a61af66fc99e Initial load
duke
parents:
diff changeset
581 // (see PackageInfo).
a61af66fc99e Initial load
duke
parents:
diff changeset
582 // Add new entry to linked list
a61af66fc99e Initial load
duke
parents:
diff changeset
583 if (!check_for_duplicates || !contains_entry(new_entry)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 add_to_list(new_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 void ClassLoader::print_bootclasspath() {
a61af66fc99e Initial load
duke
parents:
diff changeset
590 ClassPathEntry* e = _first_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
591 tty->print("[bootclasspath= ");
a61af66fc99e Initial load
duke
parents:
diff changeset
592 while (e != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
593 tty->print("%s ;", e->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
594 e = e->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
596 tty->print_cr("]");
a61af66fc99e Initial load
duke
parents:
diff changeset
597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599 void ClassLoader::load_zip_library() {
a61af66fc99e Initial load
duke
parents:
diff changeset
600 assert(ZipOpen == NULL, "should not load zip library twice");
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // First make sure native library is loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
602 os::native_java_library();
a61af66fc99e Initial load
duke
parents:
diff changeset
603 // Load zip library
a61af66fc99e Initial load
duke
parents:
diff changeset
604 char path[JVM_MAXPATHLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
605 char ebuf[1024];
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
606 os::dll_build_name(path, sizeof(path), Arguments::get_dll_dir(), "zip");
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
607 void* handle = os::dll_load(path, ebuf, sizeof ebuf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
608 if (handle == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
609 vm_exit_during_initialization("Unable to load ZIP library", path);
a61af66fc99e Initial load
duke
parents:
diff changeset
610 }
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // Lookup zip entry points
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
612 ZipOpen = CAST_TO_FN_PTR(ZipOpen_t, os::dll_lookup(handle, "ZIP_Open"));
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
613 ZipClose = CAST_TO_FN_PTR(ZipClose_t, os::dll_lookup(handle, "ZIP_Close"));
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
614 FindEntry = CAST_TO_FN_PTR(FindEntry_t, os::dll_lookup(handle, "ZIP_FindEntry"));
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
615 ReadEntry = CAST_TO_FN_PTR(ReadEntry_t, os::dll_lookup(handle, "ZIP_ReadEntry"));
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
616 ReadMappedEntry = CAST_TO_FN_PTR(ReadMappedEntry_t, os::dll_lookup(handle, "ZIP_ReadMappedEntry"));
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
617 GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
620 if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL || GetNextEntry == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
621 vm_exit_during_initialization("Corrupted ZIP library", path);
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // Lookup canonicalize entry in libjava.dll
a61af66fc99e Initial load
duke
parents:
diff changeset
625 void *javalib_handle = os::native_java_library();
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
626 CanonicalizeEntry = CAST_TO_FN_PTR(canonicalize_fn_t, os::dll_lookup(javalib_handle, "Canonicalize"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // This lookup only works on 1.3. Do not check for non-null here
a61af66fc99e Initial load
duke
parents:
diff changeset
628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // PackageInfo data exists in order to support the java.lang.Package
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // class. A Package object provides information about a java package
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // (version, vendor, etc.) which originates in the manifest of the jar
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // file supplying the package. For application classes, the ClassLoader
a61af66fc99e Initial load
duke
parents:
diff changeset
634 // object takes care of this.
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // For system (boot) classes, the Java code in the Package class needs
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // to be able to identify which source jar file contained the boot
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // class, so that it can extract the manifest from it. This table
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // identifies java packages with jar files in the boot classpath.
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // Because the boot classpath cannot change, the classpath index is
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // sufficient to identify the source jar file or directory. (Since
a61af66fc99e Initial load
duke
parents:
diff changeset
643 // directories have no manifests, the directory name is not required,
a61af66fc99e Initial load
duke
parents:
diff changeset
644 // but is available.)
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // When using sharing -- the pathnames of entries in the boot classpath
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // may not be the same at runtime as they were when the archive was
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // created (NFS, Samba, etc.). The actual files and directories named
a61af66fc99e Initial load
duke
parents:
diff changeset
649 // in the classpath must be the same files, in the same order, even
a61af66fc99e Initial load
duke
parents:
diff changeset
650 // though the exact name is not the same.
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 class PackageInfo: public BasicHashtableEntry {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
654 const char* _pkgname; // Package name
a61af66fc99e Initial load
duke
parents:
diff changeset
655 int _classpath_index; // Index of directory or JAR file loaded from
a61af66fc99e Initial load
duke
parents:
diff changeset
656
a61af66fc99e Initial load
duke
parents:
diff changeset
657 PackageInfo* next() {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 return (PackageInfo*)BasicHashtableEntry::next();
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661 const char* pkgname() { return _pkgname; }
a61af66fc99e Initial load
duke
parents:
diff changeset
662 void set_pkgname(char* pkgname) { _pkgname = pkgname; }
a61af66fc99e Initial load
duke
parents:
diff changeset
663
a61af66fc99e Initial load
duke
parents:
diff changeset
664 const char* filename() {
a61af66fc99e Initial load
duke
parents:
diff changeset
665 return ClassLoader::classpath_entry(_classpath_index)->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
666 }
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668 void set_index(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
669 _classpath_index = index;
a61af66fc99e Initial load
duke
parents:
diff changeset
670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
671 };
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673
a61af66fc99e Initial load
duke
parents:
diff changeset
674 class PackageHashtable : public BasicHashtable {
a61af66fc99e Initial load
duke
parents:
diff changeset
675 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
676 inline unsigned int compute_hash(const char *s, int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
677 unsigned int val = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
678 while (--n >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
679 val = *s++ + 31 * val;
a61af66fc99e Initial load
duke
parents:
diff changeset
680 }
a61af66fc99e Initial load
duke
parents:
diff changeset
681 return val;
a61af66fc99e Initial load
duke
parents:
diff changeset
682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
683
a61af66fc99e Initial load
duke
parents:
diff changeset
684 PackageInfo* bucket(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
685 return (PackageInfo*)BasicHashtable::bucket(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 PackageInfo* get_entry(int index, unsigned int hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
689 const char* pkgname, size_t n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
690 for (PackageInfo* pp = bucket(index); pp != NULL; pp = pp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
691 if (pp->hash() == hash &&
a61af66fc99e Initial load
duke
parents:
diff changeset
692 strncmp(pkgname, pp->pkgname(), n) == 0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
693 pp->pkgname()[n] == '\0') {
a61af66fc99e Initial load
duke
parents:
diff changeset
694 return pp;
a61af66fc99e Initial load
duke
parents:
diff changeset
695 }
a61af66fc99e Initial load
duke
parents:
diff changeset
696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
697 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
699
a61af66fc99e Initial load
duke
parents:
diff changeset
700 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
701 PackageHashtable(int table_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
702 : BasicHashtable(table_size, sizeof(PackageInfo)) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 PackageHashtable(int table_size, HashtableBucket* t, int number_of_entries)
a61af66fc99e Initial load
duke
parents:
diff changeset
705 : BasicHashtable(table_size, sizeof(PackageInfo), t, number_of_entries) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 PackageInfo* get_entry(const char* pkgname, int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
708 unsigned int hash = compute_hash(pkgname, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
709 return get_entry(hash_to_index(hash), hash, pkgname, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712 PackageInfo* new_entry(char* pkgname, int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
713 unsigned int hash = compute_hash(pkgname, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
714 PackageInfo* pp;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 pp = (PackageInfo*)BasicHashtable::new_entry(hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
716 pp->set_pkgname(pkgname);
a61af66fc99e Initial load
duke
parents:
diff changeset
717 return pp;
a61af66fc99e Initial load
duke
parents:
diff changeset
718 }
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 void add_entry(PackageInfo* pp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
721 int index = hash_to_index(pp->hash());
a61af66fc99e Initial load
duke
parents:
diff changeset
722 BasicHashtable::add_entry(index, pp);
a61af66fc99e Initial load
duke
parents:
diff changeset
723 }
a61af66fc99e Initial load
duke
parents:
diff changeset
724
a61af66fc99e Initial load
duke
parents:
diff changeset
725 void copy_pkgnames(const char** packages) {
a61af66fc99e Initial load
duke
parents:
diff changeset
726 int n = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
727 for (int i = 0; i < table_size(); ++i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
728 for (PackageInfo* pp = bucket(i); pp != NULL; pp = pp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 packages[n++] = pp->pkgname();
a61af66fc99e Initial load
duke
parents:
diff changeset
730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
732 assert(n == number_of_entries(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
734
a61af66fc99e Initial load
duke
parents:
diff changeset
735 void copy_table(char** top, char* end, PackageHashtable* table);
a61af66fc99e Initial load
duke
parents:
diff changeset
736 };
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 void PackageHashtable::copy_table(char** top, char* end,
a61af66fc99e Initial load
duke
parents:
diff changeset
740 PackageHashtable* table) {
a61af66fc99e Initial load
duke
parents:
diff changeset
741 // Copy (relocate) the table to the shared space.
a61af66fc99e Initial load
duke
parents:
diff changeset
742 BasicHashtable::copy_table(top, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
743
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // Calculate the space needed for the package name strings.
a61af66fc99e Initial load
duke
parents:
diff changeset
745 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
746 int n = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
747 for (i = 0; i < table_size(); ++i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
748 for (PackageInfo* pp = table->bucket(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
749 pp != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
750 pp = pp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
751 n += (int)(strlen(pp->pkgname()) + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
752 }
a61af66fc99e Initial load
duke
parents:
diff changeset
753 }
a61af66fc99e Initial load
duke
parents:
diff changeset
754 if (*top + n + sizeof(intptr_t) >= end) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2139
diff changeset
755 report_out_of_shared_space(SharedMiscData);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758 // Copy the table data (the strings) to the shared space.
a61af66fc99e Initial load
duke
parents:
diff changeset
759 n = align_size_up(n, sizeof(HeapWord));
a61af66fc99e Initial load
duke
parents:
diff changeset
760 *(intptr_t*)(*top) = n;
a61af66fc99e Initial load
duke
parents:
diff changeset
761 *top += sizeof(intptr_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 for (i = 0; i < table_size(); ++i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
764 for (PackageInfo* pp = table->bucket(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
765 pp != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
766 pp = pp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
767 int n1 = (int)(strlen(pp->pkgname()) + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
768 pp->set_pkgname((char*)memcpy(*top, pp->pkgname(), n1));
a61af66fc99e Initial load
duke
parents:
diff changeset
769 *top += n1;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 }
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772 *top = (char*)align_size_up((intptr_t)*top, sizeof(HeapWord));
a61af66fc99e Initial load
duke
parents:
diff changeset
773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775
a61af66fc99e Initial load
duke
parents:
diff changeset
776 void ClassLoader::copy_package_info_buckets(char** top, char* end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
777 _package_hash_table->copy_buckets(top, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
778 }
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 void ClassLoader::copy_package_info_table(char** top, char* end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
781 _package_hash_table->copy_table(top, end, _package_hash_table);
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 PackageInfo* ClassLoader::lookup_package(const char *pkgname) {
a61af66fc99e Initial load
duke
parents:
diff changeset
786 const char *cp = strrchr(pkgname, '/');
a61af66fc99e Initial load
duke
parents:
diff changeset
787 if (cp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // Package prefix found
a61af66fc99e Initial load
duke
parents:
diff changeset
789 int n = cp - pkgname + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
790 return _package_hash_table->get_entry(pkgname, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
792 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796 bool ClassLoader::add_package(const char *pkgname, int classpath_index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
797 assert(pkgname != NULL, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
798 // Bootstrap loader no longer holds system loader lock obj serializing
a61af66fc99e Initial load
duke
parents:
diff changeset
799 // load_instance_class and thereby add_package
a61af66fc99e Initial load
duke
parents:
diff changeset
800 {
a61af66fc99e Initial load
duke
parents:
diff changeset
801 MutexLocker ml(PackageTable_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // First check for previously loaded entry
a61af66fc99e Initial load
duke
parents:
diff changeset
803 PackageInfo* pp = lookup_package(pkgname);
a61af66fc99e Initial load
duke
parents:
diff changeset
804 if (pp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
805 // Existing entry found, check source of package
a61af66fc99e Initial load
duke
parents:
diff changeset
806 pp->set_index(classpath_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
807 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 const char *cp = strrchr(pkgname, '/');
a61af66fc99e Initial load
duke
parents:
diff changeset
811 if (cp != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
812 // Package prefix found
a61af66fc99e Initial load
duke
parents:
diff changeset
813 int n = cp - pkgname + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
814
a61af66fc99e Initial load
duke
parents:
diff changeset
815 char* new_pkgname = NEW_C_HEAP_ARRAY(char, n + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
816 if (new_pkgname == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
817 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
818 }
a61af66fc99e Initial load
duke
parents:
diff changeset
819
a61af66fc99e Initial load
duke
parents:
diff changeset
820 memcpy(new_pkgname, pkgname, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
821 new_pkgname[n] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
822 pp = _package_hash_table->new_entry(new_pkgname, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
823 pp->set_index(classpath_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
824
a61af66fc99e Initial load
duke
parents:
diff changeset
825 // Insert into hash table
a61af66fc99e Initial load
duke
parents:
diff changeset
826 _package_hash_table->add_entry(pp);
a61af66fc99e Initial load
duke
parents:
diff changeset
827 }
a61af66fc99e Initial load
duke
parents:
diff changeset
828 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
831
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 oop ClassLoader::get_system_package(const char* name, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
834 PackageInfo* pp;
a61af66fc99e Initial load
duke
parents:
diff changeset
835 {
a61af66fc99e Initial load
duke
parents:
diff changeset
836 MutexLocker ml(PackageTable_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 pp = lookup_package(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
839 if (pp == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
840 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
841 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
842 Handle p = java_lang_String::create_from_str(pp->filename(), THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
843 return p();
a61af66fc99e Initial load
duke
parents:
diff changeset
844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
845 }
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 objArrayOop ClassLoader::get_system_packages(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
849 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
850 int nof_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
851 const char** packages;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 {
a61af66fc99e Initial load
duke
parents:
diff changeset
853 MutexLocker ml(PackageTable_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // Allocate resource char* array containing package names
a61af66fc99e Initial load
duke
parents:
diff changeset
855 nof_entries = _package_hash_table->number_of_entries();
a61af66fc99e Initial load
duke
parents:
diff changeset
856 if ((packages = NEW_RESOURCE_ARRAY(const char*, nof_entries)) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
857 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
859 _package_hash_table->copy_pkgnames(packages);
a61af66fc99e Initial load
duke
parents:
diff changeset
860 }
a61af66fc99e Initial load
duke
parents:
diff changeset
861 // Allocate objArray and fill with java.lang.String
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 973
diff changeset
862 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
863 nof_entries, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
864 objArrayHandle result(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
865 for (int i = 0; i < nof_entries; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
866 Handle str = java_lang_String::create_from_str(packages[i], CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
867 result->obj_at_put(i, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
868 }
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 return result();
a61af66fc99e Initial load
duke
parents:
diff changeset
871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2139
diff changeset
874 instanceKlassHandle ClassLoader::load_classfile(Symbol* h_name, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
875 ResourceMark rm(THREAD);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2139
diff changeset
876 EventMark m("loading class " INTPTR_FORMAT, (address)h_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
877 ThreadProfilerMark tpm(ThreadProfilerMark::classLoaderRegion);
a61af66fc99e Initial load
duke
parents:
diff changeset
878
a61af66fc99e Initial load
duke
parents:
diff changeset
879 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // st.print() uses too much stack space while handling a StackOverflowError
a61af66fc99e Initial load
duke
parents:
diff changeset
881 // st.print("%s.class", h_name->as_utf8());
a61af66fc99e Initial load
duke
parents:
diff changeset
882 st.print_raw(h_name->as_utf8());
a61af66fc99e Initial load
duke
parents:
diff changeset
883 st.print_raw(".class");
a61af66fc99e Initial load
duke
parents:
diff changeset
884 char* name = st.as_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
885
a61af66fc99e Initial load
duke
parents:
diff changeset
886 // Lookup stream for parsing .class file
a61af66fc99e Initial load
duke
parents:
diff changeset
887 ClassFileStream* stream = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
888 int classpath_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
889 {
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
890 PerfClassTraceTime vmtimer(perf_sys_class_lookup_time(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
891 ((JavaThread*) THREAD)->get_thread_stat()->perf_timers_addr(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
892 PerfClassTraceTime::CLASS_LOAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
893 ClassPathEntry* e = _first_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
894 while (e != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
895 stream = e->open_stream(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
896 if (stream != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
897 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
899 e = e->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
900 ++classpath_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 instanceKlassHandle h(THREAD, klassOop(NULL));
a61af66fc99e Initial load
duke
parents:
diff changeset
905 if (stream != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // class file found, parse it
a61af66fc99e Initial load
duke
parents:
diff changeset
908 ClassFileParser parser(stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
909 Handle class_loader;
a61af66fc99e Initial load
duke
parents:
diff changeset
910 Handle protection_domain;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2139
diff changeset
911 TempNewSymbol parsed_name = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
912 instanceKlassHandle result = parser.parseClassFile(h_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
913 class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
914 protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
915 parsed_name,
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 882
diff changeset
916 false,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
917 CHECK_(h));
a61af66fc99e Initial load
duke
parents:
diff changeset
918
a61af66fc99e Initial load
duke
parents:
diff changeset
919 // add to package table
a61af66fc99e Initial load
duke
parents:
diff changeset
920 if (add_package(name, classpath_index, THREAD)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
921 h = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
922 }
a61af66fc99e Initial load
duke
parents:
diff changeset
923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
924
a61af66fc99e Initial load
duke
parents:
diff changeset
925 return h;
a61af66fc99e Initial load
duke
parents:
diff changeset
926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
927
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929 void ClassLoader::create_package_info_table(HashtableBucket *t, int length,
a61af66fc99e Initial load
duke
parents:
diff changeset
930 int number_of_entries) {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 assert(_package_hash_table == NULL, "One package info table allowed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
932 assert(length == package_hash_table_size * sizeof(HashtableBucket),
a61af66fc99e Initial load
duke
parents:
diff changeset
933 "bad shared package info size.");
a61af66fc99e Initial load
duke
parents:
diff changeset
934 _package_hash_table = new PackageHashtable(package_hash_table_size, t,
a61af66fc99e Initial load
duke
parents:
diff changeset
935 number_of_entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 void ClassLoader::create_package_info_table() {
a61af66fc99e Initial load
duke
parents:
diff changeset
940 assert(_package_hash_table == NULL, "shouldn't have one yet");
a61af66fc99e Initial load
duke
parents:
diff changeset
941 _package_hash_table = new PackageHashtable(package_hash_table_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // Initialize the class loader's access to methods in libzip. Parse and
a61af66fc99e Initial load
duke
parents:
diff changeset
946 // process the boot classpath into a list ClassPathEntry objects. Once
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // this list has been created, it must not change order (see class PackageInfo)
a61af66fc99e Initial load
duke
parents:
diff changeset
948 // it can be appended to and is by jvmti and the kernel vm.
a61af66fc99e Initial load
duke
parents:
diff changeset
949
a61af66fc99e Initial load
duke
parents:
diff changeset
950 void ClassLoader::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
951 assert(_package_hash_table == NULL, "should have been initialized by now.");
a61af66fc99e Initial load
duke
parents:
diff changeset
952 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
953
a61af66fc99e Initial load
duke
parents:
diff changeset
954 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
955 // jvmstat performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
956 NEWPERFTICKCOUNTER(_perf_accumulated_time, SUN_CLS, "time");
a61af66fc99e Initial load
duke
parents:
diff changeset
957 NEWPERFTICKCOUNTER(_perf_class_init_time, SUN_CLS, "classInitTime");
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
958 NEWPERFTICKCOUNTER(_perf_class_init_selftime, SUN_CLS, "classInitTime.self");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
959 NEWPERFTICKCOUNTER(_perf_class_verify_time, SUN_CLS, "classVerifyTime");
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
960 NEWPERFTICKCOUNTER(_perf_class_verify_selftime, SUN_CLS, "classVerifyTime.self");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
961 NEWPERFTICKCOUNTER(_perf_class_link_time, SUN_CLS, "classLinkedTime");
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
962 NEWPERFTICKCOUNTER(_perf_class_link_selftime, SUN_CLS, "classLinkedTime.self");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
963 NEWPERFEVENTCOUNTER(_perf_classes_inited, SUN_CLS, "initializedClasses");
a61af66fc99e Initial load
duke
parents:
diff changeset
964 NEWPERFEVENTCOUNTER(_perf_classes_linked, SUN_CLS, "linkedClasses");
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
965 NEWPERFEVENTCOUNTER(_perf_classes_verified, SUN_CLS, "verifiedClasses");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
966
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
967 NEWPERFTICKCOUNTER(_perf_class_parse_time, SUN_CLS, "parseClassTime");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
968 NEWPERFTICKCOUNTER(_perf_class_parse_selftime, SUN_CLS, "parseClassTime.self");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
969 NEWPERFTICKCOUNTER(_perf_sys_class_lookup_time, SUN_CLS, "lookupSysClassTime");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
970 NEWPERFTICKCOUNTER(_perf_shared_classload_time, SUN_CLS, "sharedClassLoadTime");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
971 NEWPERFTICKCOUNTER(_perf_sys_classload_time, SUN_CLS, "sysClassLoadTime");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
972 NEWPERFTICKCOUNTER(_perf_app_classload_time, SUN_CLS, "appClassLoadTime");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
973 NEWPERFTICKCOUNTER(_perf_app_classload_selftime, SUN_CLS, "appClassLoadTime.self");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
974 NEWPERFEVENTCOUNTER(_perf_app_classload_count, SUN_CLS, "appClassLoadCount");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
975 NEWPERFTICKCOUNTER(_perf_define_appclasses, SUN_CLS, "defineAppClasses");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
976 NEWPERFTICKCOUNTER(_perf_define_appclass_time, SUN_CLS, "defineAppClassTime");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
977 NEWPERFTICKCOUNTER(_perf_define_appclass_selftime, SUN_CLS, "defineAppClassTime.self");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
978 NEWPERFBYTECOUNTER(_perf_app_classfile_bytes_read, SUN_CLS, "appClassBytes");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
979 NEWPERFBYTECOUNTER(_perf_sys_classfile_bytes_read, SUN_CLS, "sysClassBytes");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 723
diff changeset
980
0
a61af66fc99e Initial load
duke
parents:
diff changeset
981
a61af66fc99e Initial load
duke
parents:
diff changeset
982 // The following performance counters are added for measuring the impact
a61af66fc99e Initial load
duke
parents:
diff changeset
983 // of the bug fix of 6365597. They are mainly focused on finding out
a61af66fc99e Initial load
duke
parents:
diff changeset
984 // the behavior of system & user-defined classloader lock, whether
a61af66fc99e Initial load
duke
parents:
diff changeset
985 // ClassLoader.loadClass/findClass is being called synchronized or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
986 // Also two additional counters are created to see whether 'UnsyncloadClass'
a61af66fc99e Initial load
duke
parents:
diff changeset
987 // flag is being set or not and how many times load_instance_class call
a61af66fc99e Initial load
duke
parents:
diff changeset
988 // fails with linkageError etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
989 NEWPERFEVENTCOUNTER(_sync_systemLoaderLockContentionRate, SUN_CLS,
a61af66fc99e Initial load
duke
parents:
diff changeset
990 "systemLoaderLockContentionRate");
a61af66fc99e Initial load
duke
parents:
diff changeset
991 NEWPERFEVENTCOUNTER(_sync_nonSystemLoaderLockContentionRate, SUN_CLS,
a61af66fc99e Initial load
duke
parents:
diff changeset
992 "nonSystemLoaderLockContentionRate");
a61af66fc99e Initial load
duke
parents:
diff changeset
993 NEWPERFEVENTCOUNTER(_sync_JVMFindLoadedClassLockFreeCounter, SUN_CLS,
a61af66fc99e Initial load
duke
parents:
diff changeset
994 "jvmFindLoadedClassNoLockCalls");
a61af66fc99e Initial load
duke
parents:
diff changeset
995 NEWPERFEVENTCOUNTER(_sync_JVMDefineClassLockFreeCounter, SUN_CLS,
a61af66fc99e Initial load
duke
parents:
diff changeset
996 "jvmDefineClassNoLockCalls");
a61af66fc99e Initial load
duke
parents:
diff changeset
997
a61af66fc99e Initial load
duke
parents:
diff changeset
998 NEWPERFEVENTCOUNTER(_sync_JNIDefineClassLockFreeCounter, SUN_CLS,
a61af66fc99e Initial load
duke
parents:
diff changeset
999 "jniDefineClassNoLockCalls");
a61af66fc99e Initial load
duke
parents:
diff changeset
1000
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 NEWPERFEVENTCOUNTER(_unsafe_defineClassCallCounter, SUN_CLS,
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 "unsafeDefineClassCalls");
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 NEWPERFEVENTCOUNTER(_isUnsyncloadClass, SUN_CLS, "isUnsyncloadClassSet");
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 NEWPERFEVENTCOUNTER(_load_instance_class_failCounter, SUN_CLS,
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 "loadInstanceClassFailRate");
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 // increment the isUnsyncloadClass counter if UnsyncloadClass is set.
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 if (UnsyncloadClass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 _isUnsyncloadClass->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1013
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 // lookup zip library entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 load_zip_library();
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // initialize search path
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 setup_bootstrap_search_path();
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 if (LazyBootClassLoader) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 // set up meta index which makes boot classpath initialization lazier
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 setup_meta_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1023
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 jlong ClassLoader::classloader_time_ms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 return UsePerfData ?
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 Management::ticks_to_ms(_perf_accumulated_time->get_value()) : -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1029
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 jlong ClassLoader::class_init_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 return UsePerfData ? _perf_classes_inited->get_value() : -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1033
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 jlong ClassLoader::class_init_time_ms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 return UsePerfData ?
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 Management::ticks_to_ms(_perf_class_init_time->get_value()) : -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1038
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 jlong ClassLoader::class_verify_time_ms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 return UsePerfData ?
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 Management::ticks_to_ms(_perf_class_verify_time->get_value()) : -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1043
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 jlong ClassLoader::class_link_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 return UsePerfData ? _perf_classes_linked->get_value() : -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1047
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 jlong ClassLoader::class_link_time_ms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 return UsePerfData ?
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 Management::ticks_to_ms(_perf_class_link_time->get_value()) : -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1052
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 int ClassLoader::compute_Object_vtable() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 // hardwired for JDK1.2 -- would need to duplicate class file parsing
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // code to determine actual value from file
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 // Would be value '11' if finals were in vtable
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 int JDK_1_2_Object_vtable_size = 5;
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 return JDK_1_2_Object_vtable_size * vtableEntry::size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1060
a61af66fc99e Initial load
duke
parents:
diff changeset
1061
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 void classLoader_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 ClassLoader::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1065
a61af66fc99e Initial load
duke
parents:
diff changeset
1066
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 bool ClassLoader::get_canonical_path(char* orig, char* out, int len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 assert(orig != NULL && out != NULL && len > 0, "bad arguments");
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 if (CanonicalizeEntry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 JNIEnv* env = JavaThread::current()->jni_environment();
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1071 if ((CanonicalizeEntry)(env, os::native_path(orig), out, len) < 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // On JDK 1.2.2 the Canonicalize does not exist, so just do nothing
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 strncpy(out, orig, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 out[len - 1] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1081
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 void ClassLoader::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 _package_hash_table->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1087
a61af66fc99e Initial load
duke
parents:
diff changeset
1088
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // CompileTheWorld
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // Iterates over all class path entries and forces compilation of all methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 // in all classes found. Currently, only zip/jar archives are searched.
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // The classes are loaded by the Java level bootstrap class loader, and the
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 // initializer is called. If DelayCompilationDuringStartup is true (default),
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 // the interpreter will run the initialization code. Note that forcing
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // initialization in this way could potentially lead to initialization order
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // problems, in which case we could just force the initialization bit to be set.
a61af66fc99e Initial load
duke
parents:
diff changeset
1099
a61af66fc99e Initial load
duke
parents:
diff changeset
1100
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 // We need to iterate over the contents of a zip/jar file, so we replicate the
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 // jzcell and jzfile definitions from zip_util.h but rename jzfile to real_jzfile,
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 // since jzfile already has a void* definition.
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 // Note that this is only used in debug mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // HotSpot integration note:
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // Matches zip_util.h 1.14 99/06/01 from jdk1.3 beta H build
a61af66fc99e Initial load
duke
parents:
diff changeset
1109
a61af66fc99e Initial load
duke
parents:
diff changeset
1110
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 // JDK 1.3 version
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 typedef struct real_jzentry13 { /* Zip file entry */
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 char *name; /* entry name */
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 jint time; /* modification time */
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 jint size; /* size of uncompressed data */
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 jint csize; /* size of compressed data (zero if uncompressed) */
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 jint crc; /* crc of uncompressed data */
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 char *comment; /* optional zip file comment */
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 jbyte *extra; /* optional extra data */
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 jint pos; /* position of LOC header (if negative) or data */
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 } real_jzentry13;
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 typedef struct real_jzfile13 { /* Zip file */
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 char *name; /* zip file name */
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 jint refs; /* number of active references */
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 jint fd; /* open file descriptor */
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 void *lock; /* read lock */
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 char *comment; /* zip file comment */
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 char *msg; /* zip error message */
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 void *entries; /* array of hash cells */
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 jint total; /* total number of entries */
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 unsigned short *table; /* Hash chain heads: indexes into entries */
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 jint tablelen; /* number of hash eads */
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 real_jzfile13 *next; /* next zip file in search list */
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 jzentry *cache; /* we cache the most recently freed jzentry */
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 /* Information on metadata names in META-INF directory */
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 char **metanames; /* array of meta names (may have null names) */
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 jint metacount; /* number of slots in metanames array */
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 /* If there are any per-entry comments, they are in the comments array */
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 char **comments;
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 } real_jzfile13;
a61af66fc99e Initial load
duke
parents:
diff changeset
1142
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // JDK 1.2 version
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 typedef struct real_jzentry12 { /* Zip file entry */
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 char *name; /* entry name */
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 jint time; /* modification time */
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 jint size; /* size of uncompressed data */
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 jint csize; /* size of compressed data (zero if uncompressed) */
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 jint crc; /* crc of uncompressed data */
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 char *comment; /* optional zip file comment */
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 jbyte *extra; /* optional extra data */
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 jint pos; /* position of LOC header (if negative) or data */
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 struct real_jzentry12 *next; /* next entry in hash table */
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 } real_jzentry12;
a61af66fc99e Initial load
duke
parents:
diff changeset
1155
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 typedef struct real_jzfile12 { /* Zip file */
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 char *name; /* zip file name */
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 jint refs; /* number of active references */
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 jint fd; /* open file descriptor */
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 void *lock; /* read lock */
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 char *comment; /* zip file comment */
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 char *msg; /* zip error message */
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 real_jzentry12 *entries; /* array of zip entries */
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 jint total; /* total number of entries */
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 real_jzentry12 **table; /* hash table of entries */
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 jint tablelen; /* number of buckets */
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 jzfile *next; /* next zip file in search list */
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 } real_jzfile12;
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 void ClassPathDirEntry::compile_the_world(Handle loader, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 // For now we only compile all methods in all classes in zip/jar files
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 tty->print_cr("CompileTheWorld : Skipped classes in %s", _dir);
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1176
a61af66fc99e Initial load
duke
parents:
diff changeset
1177
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 bool ClassPathDirEntry::is_rt_jar() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1181
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 void ClassPathZipEntry::compile_the_world(Handle loader, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 if (JDK_Version::is_jdk12x_version()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 compile_the_world12(loader, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 compile_the_world13(loader, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 if (PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 tty->print_cr("\nCompileTheWorld : Ran out of memory\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 size_t used = Universe::heap()->permanent_used();
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 size_t capacity = Universe::heap()->permanent_capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 tty->print_cr("Permanent generation used %dK of %dK", used/K, capacity/K);
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 tty->print_cr("Increase size by setting e.g. -XX:MaxPermSize=%dK\n", capacity*2/K);
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 tty->print_cr("\nCompileTheWorld : Unexpected exception occurred\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // Version that works for JDK 1.3.x
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 void ClassPathZipEntry::compile_the_world13(Handle loader, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 real_jzfile13* zip = (real_jzfile13*) _zip;
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 tty->print_cr("CompileTheWorld : Compiling all classes in %s", zip->name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 // Iterate over all entries in zip file
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 for (int n = 0; ; n++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 real_jzentry13 * ze = (real_jzentry13 *)((*GetNextEntry)(_zip, n));
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 if (ze == NULL) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 ClassLoader::compile_the_world_in(ze->name, loader, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1214
a61af66fc99e Initial load
duke
parents:
diff changeset
1215
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 // Version that works for JDK 1.2.x
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 void ClassPathZipEntry::compile_the_world12(Handle loader, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 real_jzfile12* zip = (real_jzfile12*) _zip;
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 tty->print_cr("CompileTheWorld : Compiling all classes in %s", zip->name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 // Iterate over all entries in zip file
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 for (int n = 0; ; n++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 real_jzentry12 * ze = (real_jzentry12 *)((*GetNextEntry)(_zip, n));
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 if (ze == NULL) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 ClassLoader::compile_the_world_in(ze->name, loader, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1228
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 bool ClassPathZipEntry::is_rt_jar() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 if (JDK_Version::is_jdk12x_version()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 return is_rt_jar12();
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 return is_rt_jar13();
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1236
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 // JDK 1.3 version
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 bool ClassPathZipEntry::is_rt_jar13() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 real_jzfile13* zip = (real_jzfile13*) _zip;
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 int len = (int)strlen(zip->name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 // Check whether zip name ends in "rt.jar"
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 // This will match other archives named rt.jar as well, but this is
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 // only used for debugging.
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 return (len >= 6) && (strcasecmp(zip->name + len - 6, "rt.jar") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1246
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // JDK 1.2 version
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 bool ClassPathZipEntry::is_rt_jar12() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 real_jzfile12* zip = (real_jzfile12*) _zip;
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 int len = (int)strlen(zip->name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 // Check whether zip name ends in "rt.jar"
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // This will match other archives named rt.jar as well, but this is
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 // only used for debugging.
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 return (len >= 6) && (strcasecmp(zip->name + len - 6, "rt.jar") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1256
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 void LazyClassPathEntry::compile_the_world(Handle loader, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 resolve_entry()->compile_the_world(loader, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1260
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 bool LazyClassPathEntry::is_rt_jar() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 return resolve_entry()->is_rt_jar();
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1264
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 void ClassLoader::compile_the_world() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 HandleMark hm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 // Make sure we don't run with background compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 BackgroundCompilation = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 // Find bootstrap loader
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 Handle system_class_loader (THREAD, SystemDictionary::java_system_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 // Iterate over all bootstrap class path entries
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 ClassPathEntry* e = _first_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 while (e != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 // We stop at rt.jar, unless it is the first bootstrap path entry
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 if (e->is_rt_jar() && e != _first_entry) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 e->compile_the_world(system_class_loader, CATCH);
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 e = e->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 tty->print_cr("CompileTheWorld : Done");
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 // Print statistics as if before normal exit:
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 extern void print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 vm_exit(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1289
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 int ClassLoader::_compile_the_world_counter = 0;
1188
99af867dfa05 6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents: 1142
diff changeset
1291 static int _codecache_sweep_counter = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1292
2257
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1293 // Filter out all exceptions except OOMs
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1294 static void clear_pending_exception_if_not_oom(TRAPS) {
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1295 if (HAS_PENDING_EXCEPTION &&
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1296 !PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1297 CLEAR_PENDING_EXCEPTION;
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1298 }
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1299 // The CHECK at the caller will propagate the exception out
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1300 }
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1301
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 int len = (int)strlen(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 if (len > 6 && strcmp(".class", name + len - 6) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 // We have a .class file
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 char buffer[2048];
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 strncpy(buffer, name, len - 6);
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 buffer[len-6] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 // If the file has a period after removing .class, it's not really a
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 // valid class file. The class loader will check everything else.
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 if (strchr(buffer, '.') == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 _compile_the_world_counter++;
723
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1313 if (_compile_the_world_counter > CompileTheWorldStopAt) return;
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1314
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1315 // Construct name without extension
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2139
diff changeset
1316 TempNewSymbol sym = SymbolTable::new_symbol(buffer, CHECK);
723
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1317 // Use loader to load and initialize class
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1318 klassOop ik = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD);
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1319 instanceKlassHandle k (THREAD, ik);
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1320 if (k.not_null() && !HAS_PENDING_EXCEPTION) {
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1321 k->initialize(THREAD);
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1322 }
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1323 bool exception_occurred = HAS_PENDING_EXCEPTION;
2257
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1324 clear_pending_exception_if_not_oom(CHECK);
723
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1325 if (CompileTheWorldPreloadClasses && k.not_null()) {
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1326 constantPoolKlass::preload_and_initialize_all_classes(k->constants(), THREAD);
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1327 if (HAS_PENDING_EXCEPTION) {
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1328 // If something went wrong in preloading we just ignore it
2257
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1329 clear_pending_exception_if_not_oom(CHECK);
723
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1330 tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_counter, buffer);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 }
723
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1332 }
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1333
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1334 if (_compile_the_world_counter >= CompileTheWorldStartAt) {
2323
bc6b27fb3568 6725983: Assertion "method->method_holder())->is_not_initialized(),"method holder must be initialized"
never
parents: 2257
diff changeset
1335 if (k.is_null() || exception_occurred) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 // If something went wrong (e.g. ExceptionInInitializerError) we skip this class
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_counter, buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 tty->print_cr("CompileTheWorld (%d) : %s", _compile_the_world_counter, buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 // Preload all classes to get around uncommon traps
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 // Iterate over all methods in class
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 for (int n = 0; n < k->methods()->length(); n++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 methodHandle m (THREAD, methodOop(k->methods()->obj_at(n)));
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1644
diff changeset
1344 if (CompilationPolicy::can_be_compiled(m)) {
1188
99af867dfa05 6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents: 1142
diff changeset
1345
99af867dfa05 6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents: 1142
diff changeset
1346 if (++_codecache_sweep_counter == CompileTheWorldSafepointInterval) {
99af867dfa05 6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents: 1142
diff changeset
1347 // Give sweeper a chance to keep up with CTW
99af867dfa05 6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents: 1142
diff changeset
1348 VM_ForceSafepoint op;
99af867dfa05 6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents: 1142
diff changeset
1349 VMThread::execute(&op);
99af867dfa05 6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents: 1142
diff changeset
1350 _codecache_sweep_counter = 0;
99af867dfa05 6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents: 1142
diff changeset
1351 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 // Force compilation
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1644
diff changeset
1353 CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_initial_compile,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 methodHandle(), 0, "CTW", THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 if (HAS_PENDING_EXCEPTION) {
2257
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1356 clear_pending_exception_if_not_oom(CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 }
723
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1359 if (TieredCompilation) {
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1360 // Clobber the first compile and force second tier compilation
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1361 nmethod* nm = m->code();
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1362 if (nm != NULL) {
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1363 // Throw out the code so that the code cache doesn't fill up
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1364 nm->make_not_entrant();
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1365 m->clear_code();
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1366 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1644
diff changeset
1367 CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_full_optimization,
723
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1368 methodHandle(), 0, "CTW", THREAD);
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1369 if (HAS_PENDING_EXCEPTION) {
2257
34457f6ac818 7018506: CTW swallowing OOMs after symbol changes
never
parents: 2177
diff changeset
1370 clear_pending_exception_if_not_oom(CHECK);
723
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1371 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string());
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1372 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 }
723
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1375
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1376 nmethod* nm = m->code();
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1377 if (nm != NULL) {
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1378 // Throw out the code so that the code cache doesn't fill up
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1379 nm->make_not_entrant();
3ec1ff9307d6 6741757: minor ctw improvements
never
parents: 0
diff changeset
1380 m->clear_code();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 #endif //PRODUCT
2139
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1390
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1391 // Please keep following two functions at end of this file. With them placed at top or in middle of the file,
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1392 // they could get inlined by agressive compiler, an unknown trick, see bug 6966589.
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1393 void PerfClassTraceTime::initialize() {
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1394 if (!UsePerfData) return;
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1395
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1396 if (_eventp != NULL) {
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1397 // increment the event counter
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1398 _eventp->inc();
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1399 }
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1400
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1401 // stop the current active thread-local timer to measure inclusive time
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1402 _prev_active_event = -1;
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1403 for (int i=0; i < EVENT_TYPE_COUNT; i++) {
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1404 if (_timers[i].is_active()) {
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1405 assert(_prev_active_event == -1, "should have only one active timer");
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1406 _prev_active_event = i;
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1407 _timers[i].stop();
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1408 }
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1409 }
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1410
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1411 if (_recursion_counters == NULL || (_recursion_counters[_event_type])++ == 0) {
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1412 // start the inclusive timer if not recursively called
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1413 _t.start();
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1414 }
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1415
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1416 // start thread-local timer of the given event type
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1417 if (!_timers[_event_type].is_active()) {
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1418 _timers[_event_type].start();
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1419 }
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1420 }
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1421
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1422 PerfClassTraceTime::~PerfClassTraceTime() {
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1423 if (!UsePerfData) return;
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1424
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1425 // stop the thread-local timer as the event completes
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1426 // and resume the thread-local timer of the event next on the stack
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1427 _timers[_event_type].stop();
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1428 jlong selftime = _timers[_event_type].ticks();
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1429
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1430 if (_prev_active_event >= 0) {
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1431 _timers[_prev_active_event].start();
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1432 }
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1433
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1434 if (_recursion_counters != NULL && --(_recursion_counters[_event_type]) > 0) return;
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1435
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1436 // increment the counters only on the leaf call
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1437 _t.stop();
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1438 _timep->inc(_t.ticks());
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1439 if (_selftimep != NULL) {
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1440 _selftimep->inc(selftime);
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1441 }
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1442 // add all class loading related event selftime to the accumulated time counter
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1443 ClassLoader::perf_accumulated_time()->inc(selftime);
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1444
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1445 // reset the timer
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1446 _timers[_event_type].reset();
75efcee5ac47 6966589: hs16-b08 causes java.lang.StackOverflowError
minqi
parents: 1980
diff changeset
1447 }