1 /*
2 * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "jvm.h"
27 #include "jimage.hpp"
28 #include "classfile/classFileStream.hpp"
29 #include "classfile/classLoader.inline.hpp"
30 #include "classfile/classLoaderData.inline.hpp"
31 #include "classfile/classLoaderExt.hpp"
32 #include "classfile/javaClasses.hpp"
33 #include "classfile/moduleEntry.hpp"
34 #include "classfile/modules.hpp"
35 #include "classfile/packageEntry.hpp"
36 #include "classfile/klassFactory.hpp"
37 #include "classfile/symbolTable.hpp"
38 #include "classfile/systemDictionary.hpp"
39 #include "classfile/systemDictionaryShared.hpp"
40 #include "classfile/vmSymbols.hpp"
41 #include "compiler/compileBroker.hpp"
42 #include "interpreter/bytecodeStream.hpp"
43 #include "interpreter/oopMapCache.hpp"
44 #include "logging/log.hpp"
45 #include "logging/logStream.hpp"
46 #include "logging/logTag.hpp"
47 #include "memory/allocation.inline.hpp"
48 #include "memory/filemap.hpp"
49 #include "memory/oopFactory.hpp"
50 #include "memory/resourceArea.hpp"
51 #include "memory/universe.hpp"
52 #include "oops/instanceKlass.hpp"
53 #include "oops/instanceRefKlass.hpp"
54 #include "oops/method.inline.hpp"
55 #include "oops/objArrayOop.inline.hpp"
56 #include "oops/oop.inline.hpp"
57 #include "oops/symbol.hpp"
58 #include "prims/jvm_misc.hpp"
59 #include "runtime/arguments.hpp"
60 #include "runtime/handles.inline.hpp"
61 #include "runtime/init.hpp"
62 #include "runtime/interfaceSupport.inline.hpp"
63 #include "runtime/java.hpp"
64 #include "runtime/javaCalls.hpp"
65 #include "runtime/os.inline.hpp"
66 #include "runtime/threadCritical.hpp"
67 #include "runtime/timer.hpp"
68 #include "runtime/vm_version.hpp"
69 #include "services/management.hpp"
70 #include "services/threadService.hpp"
71 #include "utilities/classpathStream.hpp"
72 #include "utilities/events.hpp"
73 #include "utilities/hashtable.inline.hpp"
74 #include "utilities/macros.hpp"
75 #include "utilities/utf8.hpp"
76
77 // Entry point in java.dll for path canonicalization
78
79 typedef int (*canonicalize_fn_t)(const char *orig, char *out, int len);
80
81 static canonicalize_fn_t CanonicalizeEntry = NULL;
82
83 // Entry points in zip.dll for loading zip/jar file entries
84
85 typedef void * * (*ZipOpen_t)(const char *name, char **pmsg);
86 typedef void (*ZipClose_t)(jzfile *zip);
87 typedef jzentry* (*FindEntry_t)(jzfile *zip, const char *name, jint *sizeP, jint *nameLen);
88 typedef jboolean (*ReadEntry_t)(jzfile *zip, jzentry *entry, unsigned char *buf, char *namebuf);
89 typedef jzentry* (*GetNextEntry_t)(jzfile *zip, jint n);
90 typedef jint (*Crc32_t)(jint crc, const jbyte *buf, jint len);
91
92 static ZipOpen_t ZipOpen = NULL;
93 static ZipClose_t ZipClose = NULL;
94 static FindEntry_t FindEntry = NULL;
95 static ReadEntry_t ReadEntry = NULL;
96 static GetNextEntry_t GetNextEntry = NULL;
97 static Crc32_t Crc32 = NULL;
98 int ClassLoader::_libzip_loaded = 0;
99
100 // Entry points for jimage.dll for loading jimage file entries
101
102 static JImageOpen_t JImageOpen = NULL;
103 static JImageClose_t JImageClose = NULL;
104 static JImagePackageToModule_t JImagePackageToModule = NULL;
105 static JImageFindResource_t JImageFindResource = NULL;
106 static JImageGetResource_t JImageGetResource = NULL;
107 static JImageResourceIterator_t JImageResourceIterator = NULL;
108
109 // Globals
110
111 PerfCounter* ClassLoader::_perf_accumulated_time = NULL;
112 PerfCounter* ClassLoader::_perf_classes_inited = NULL;
113 PerfCounter* ClassLoader::_perf_class_init_time = NULL;
114 PerfCounter* ClassLoader::_perf_class_init_selftime = NULL;
115 PerfCounter* ClassLoader::_perf_classes_verified = NULL;
116 PerfCounter* ClassLoader::_perf_class_verify_time = NULL;
117 PerfCounter* ClassLoader::_perf_class_verify_selftime = NULL;
118 PerfCounter* ClassLoader::_perf_classes_linked = NULL;
119 PerfCounter* ClassLoader::_perf_class_link_time = NULL;
120 PerfCounter* ClassLoader::_perf_class_link_selftime = NULL;
121 PerfCounter* ClassLoader::_perf_sys_class_lookup_time = NULL;
122 PerfCounter* ClassLoader::_perf_shared_classload_time = NULL;
123 PerfCounter* ClassLoader::_perf_sys_classload_time = NULL;
124 PerfCounter* ClassLoader::_perf_app_classload_time = NULL;
125 PerfCounter* ClassLoader::_perf_app_classload_selftime = NULL;
126 PerfCounter* ClassLoader::_perf_app_classload_count = NULL;
127 PerfCounter* ClassLoader::_perf_define_appclasses = NULL;
128 PerfCounter* ClassLoader::_perf_define_appclass_time = NULL;
129 PerfCounter* ClassLoader::_perf_define_appclass_selftime = NULL;
130 PerfCounter* ClassLoader::_perf_app_classfile_bytes_read = NULL;
131 PerfCounter* ClassLoader::_perf_sys_classfile_bytes_read = NULL;
132 PerfCounter* ClassLoader::_sync_systemLoaderLockContentionRate = NULL;
133 PerfCounter* ClassLoader::_sync_nonSystemLoaderLockContentionRate = NULL;
134 PerfCounter* ClassLoader::_sync_JVMFindLoadedClassLockFreeCounter = NULL;
135 PerfCounter* ClassLoader::_sync_JVMDefineClassLockFreeCounter = NULL;
136 PerfCounter* ClassLoader::_sync_JNIDefineClassLockFreeCounter = NULL;
137 PerfCounter* ClassLoader::_unsafe_defineClassCallCounter = NULL;
138
139 GrowableArray<ModuleClassPathList*>* ClassLoader::_patch_mod_entries = NULL;
140 GrowableArray<ModuleClassPathList*>* ClassLoader::_exploded_entries = NULL;
141 ClassPathEntry* ClassLoader::_jrt_entry = NULL;
142 ClassPathEntry* ClassLoader::_first_append_entry = NULL;
143 ClassPathEntry* ClassLoader::_last_append_entry = NULL;
144 #if INCLUDE_CDS
145 ClassPathEntry* ClassLoader::_app_classpath_entries = NULL;
146 ClassPathEntry* ClassLoader::_last_app_classpath_entry = NULL;
147 ClassPathEntry* ClassLoader::_module_path_entries = NULL;
148 ClassPathEntry* ClassLoader::_last_module_path_entry = NULL;
149 #endif
150
151 // helper routines
string_starts_with(const char * str,const char * str_to_find)152 bool string_starts_with(const char* str, const char* str_to_find) {
153 size_t str_len = strlen(str);
154 size_t str_to_find_len = strlen(str_to_find);
155 if (str_to_find_len > str_len) {
156 return false;
157 }
158 return (strncmp(str, str_to_find, str_to_find_len) == 0);
159 }
160
get_jimage_version_string()161 static const char* get_jimage_version_string() {
162 static char version_string[10] = "";
163 if (version_string[0] == '\0') {
164 jio_snprintf(version_string, sizeof(version_string), "%d.%d",
165 VM_Version::vm_major_version(), VM_Version::vm_minor_version());
166 }
167 return (const char*)version_string;
168 }
169
string_ends_with(const char * str,const char * str_to_find)170 bool ClassLoader::string_ends_with(const char* str, const char* str_to_find) {
171 size_t str_len = strlen(str);
172 size_t str_to_find_len = strlen(str_to_find);
173 if (str_to_find_len > str_len) {
174 return false;
175 }
176 return (strncmp(str + (str_len - str_to_find_len), str_to_find, str_to_find_len) == 0);
177 }
178
179 // Used to obtain the package name from a fully qualified class name.
package_from_class_name(const Symbol * name,bool * bad_class_name)180 Symbol* ClassLoader::package_from_class_name(const Symbol* name, bool* bad_class_name) {
181 if (name == NULL) {
182 if (bad_class_name != NULL) {
183 *bad_class_name = true;
184 }
185 return NULL;
186 }
187
188 int utf_len = name->utf8_length();
189 const jbyte* base = (const jbyte*)name->base();
190 const jbyte* start = base;
191 const jbyte* end = UTF8::strrchr(start, utf_len, JVM_SIGNATURE_SLASH);
192 if (end == NULL) {
193 return NULL;
194 }
195 // Skip over '['s
196 if (*start == JVM_SIGNATURE_ARRAY) {
197 do {
198 start++;
199 } while (start < end && *start == JVM_SIGNATURE_ARRAY);
200
201 // Fully qualified class names should not contain a 'L'.
202 // Set bad_class_name to true to indicate that the package name
203 // could not be obtained due to an error condition.
204 // In this situation, is_same_class_package returns false.
205 if (*start == JVM_SIGNATURE_CLASS) {
206 if (bad_class_name != NULL) {
207 *bad_class_name = true;
208 }
209 return NULL;
210 }
211 }
212 // A class name could have just the slash character in the name,
213 // in which case start > end
214 if (start >= end) {
215 // No package name
216 if (bad_class_name != NULL) {
217 *bad_class_name = true;
218 }
219 return NULL;
220 }
221 return SymbolTable::new_symbol(name, start - base, end - base);
222 }
223
224 // Given a fully qualified package name, find its defining package in the class loader's
225 // package entry table.
get_package_entry(Symbol * pkg_name,ClassLoaderData * loader_data)226 PackageEntry* ClassLoader::get_package_entry(Symbol* pkg_name, ClassLoaderData* loader_data) {
227 if (pkg_name == NULL) {
228 return NULL;
229 }
230 PackageEntryTable* pkgEntryTable = loader_data->packages();
231 return pkgEntryTable->lookup_only(pkg_name);
232 }
233
copy_path(const char * path)234 const char* ClassPathEntry::copy_path(const char* path) {
235 char* copy = NEW_C_HEAP_ARRAY(char, strlen(path)+1, mtClass);
236 strcpy(copy, path);
237 return copy;
238 }
239
open_stream(const char * name,TRAPS)240 ClassFileStream* ClassPathDirEntry::open_stream(const char* name, TRAPS) {
241 // construct full path name
242 assert((_dir != NULL) && (name != NULL), "sanity");
243 size_t path_len = strlen(_dir) + strlen(name) + strlen(os::file_separator()) + 1;
244 char* path = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, path_len);
245 int len = jio_snprintf(path, path_len, "%s%s%s", _dir, os::file_separator(), name);
246 assert(len == (int)(path_len - 1), "sanity");
247 // check if file exists
248 struct stat st;
249 if (os::stat(path, &st) == 0) {
250 // found file, open it
251 int file_handle = os::open(path, 0, 0);
252 if (file_handle != -1) {
253 // read contents into resource array
254 u1* buffer = NEW_RESOURCE_ARRAY(u1, st.st_size);
255 size_t num_read = os::read(file_handle, (char*) buffer, st.st_size);
256 // close file
257 os::close(file_handle);
258 // construct ClassFileStream
259 if (num_read == (size_t)st.st_size) {
260 if (UsePerfData) {
261 ClassLoader::perf_sys_classfile_bytes_read()->inc(num_read);
262 }
263 FREE_RESOURCE_ARRAY(char, path, path_len);
264 // Resource allocated
265 return new ClassFileStream(buffer,
266 st.st_size,
267 _dir,
268 ClassFileStream::verify);
269 }
270 }
271 }
272 FREE_RESOURCE_ARRAY(char, path, path_len);
273 return NULL;
274 }
275
ClassPathZipEntry(jzfile * zip,const char * zip_name,bool is_boot_append,bool from_class_path_attr)276 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name,
277 bool is_boot_append, bool from_class_path_attr) : ClassPathEntry() {
278 _zip = zip;
279 _zip_name = copy_path(zip_name);
280 _from_class_path_attr = from_class_path_attr;
281 }
282
~ClassPathZipEntry()283 ClassPathZipEntry::~ClassPathZipEntry() {
284 (*ZipClose)(_zip);
285 FREE_C_HEAP_ARRAY(char, _zip_name);
286 }
287
open_entry(const char * name,jint * filesize,bool nul_terminate,TRAPS)288 u1* ClassPathZipEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) {
289 // enable call to C land
290 JavaThread* thread = JavaThread::current();
291 ThreadToNativeFromVM ttn(thread);
292 // check whether zip archive contains name
293 jint name_len;
294 jzentry* entry = (*FindEntry)(_zip, name, filesize, &name_len);
295 if (entry == NULL) return NULL;
296 u1* buffer;
297 char name_buf[128];
298 char* filename;
299 if (name_len < 128) {
300 filename = name_buf;
301 } else {
302 filename = NEW_RESOURCE_ARRAY(char, name_len + 1);
303 }
304
305 // read contents into resource array
306 int size = (*filesize) + ((nul_terminate) ? 1 : 0);
307 buffer = NEW_RESOURCE_ARRAY(u1, size);
308 if (!(*ReadEntry)(_zip, entry, buffer, filename)) return NULL;
309
310 // return result
311 if (nul_terminate) {
312 buffer[*filesize] = 0;
313 }
314 return buffer;
315 }
316
open_stream(const char * name,TRAPS)317 ClassFileStream* ClassPathZipEntry::open_stream(const char* name, TRAPS) {
318 jint filesize;
319 u1* buffer = open_entry(name, &filesize, false, CHECK_NULL);
320 if (buffer == NULL) {
321 return NULL;
322 }
323 if (UsePerfData) {
324 ClassLoader::perf_sys_classfile_bytes_read()->inc(filesize);
325 }
326 // Resource allocated
327 return new ClassFileStream(buffer,
328 filesize,
329 _zip_name,
330 ClassFileStream::verify);
331 }
332
333 // invoke function for each entry in the zip file
contents_do(void f (const char * name,void * context),void * context)334 void ClassPathZipEntry::contents_do(void f(const char* name, void* context), void* context) {
335 JavaThread* thread = JavaThread::current();
336 HandleMark handle_mark(thread);
337 ThreadToNativeFromVM ttn(thread);
338 for (int n = 0; ; n++) {
339 jzentry * ze = ((*GetNextEntry)(_zip, n));
340 if (ze == NULL) break;
341 (*f)(ze->name, context);
342 }
343 }
344
DEBUG_ONLY(ClassPathImageEntry * ClassPathImageEntry::_singleton=NULL;)345 DEBUG_ONLY(ClassPathImageEntry* ClassPathImageEntry::_singleton = NULL;)
346
347 void ClassPathImageEntry::close_jimage() {
348 if (_jimage != NULL) {
349 (*JImageClose)(_jimage);
350 _jimage = NULL;
351 }
352 }
353
ClassPathImageEntry(JImageFile * jimage,const char * name)354 ClassPathImageEntry::ClassPathImageEntry(JImageFile* jimage, const char* name) :
355 ClassPathEntry(),
356 _jimage(jimage) {
357 guarantee(jimage != NULL, "jimage file is null");
358 guarantee(name != NULL, "jimage file name is null");
359 assert(_singleton == NULL, "VM supports only one jimage");
360 DEBUG_ONLY(_singleton = this);
361 size_t len = strlen(name) + 1;
362 _name = copy_path(name);
363 }
364
~ClassPathImageEntry()365 ClassPathImageEntry::~ClassPathImageEntry() {
366 assert(_singleton == this, "must be");
367 DEBUG_ONLY(_singleton = NULL);
368
369 FREE_C_HEAP_ARRAY(const char, _name);
370
371 if (_jimage != NULL) {
372 (*JImageClose)(_jimage);
373 _jimage = NULL;
374 }
375 }
376
open_stream(const char * name,TRAPS)377 ClassFileStream* ClassPathImageEntry::open_stream(const char* name, TRAPS) {
378 return open_stream_for_loader(name, ClassLoaderData::the_null_class_loader_data(), THREAD);
379 }
380
381 // For a class in a named module, look it up in the jimage file using this syntax:
382 // /<module-name>/<package-name>/<base-class>
383 //
384 // Assumptions:
385 // 1. There are no unnamed modules in the jimage file.
386 // 2. A package is in at most one module in the jimage file.
387 //
open_stream_for_loader(const char * name,ClassLoaderData * loader_data,TRAPS)388 ClassFileStream* ClassPathImageEntry::open_stream_for_loader(const char* name, ClassLoaderData* loader_data, TRAPS) {
389 jlong size;
390 JImageLocationRef location = (*JImageFindResource)(_jimage, "", get_jimage_version_string(), name, &size);
391
392 if (location == 0) {
393 TempNewSymbol class_name = SymbolTable::new_symbol(name);
394 TempNewSymbol pkg_name = ClassLoader::package_from_class_name(class_name);
395
396 if (pkg_name != NULL) {
397 if (!Universe::is_module_initialized()) {
398 location = (*JImageFindResource)(_jimage, JAVA_BASE_NAME, get_jimage_version_string(), name, &size);
399 } else {
400 PackageEntry* package_entry = ClassLoader::get_package_entry(pkg_name, loader_data);
401 if (package_entry != NULL) {
402 ResourceMark rm(THREAD);
403 // Get the module name
404 ModuleEntry* module = package_entry->module();
405 assert(module != NULL, "Boot classLoader package missing module");
406 assert(module->is_named(), "Boot classLoader package is in unnamed module");
407 const char* module_name = module->name()->as_C_string();
408 if (module_name != NULL) {
409 location = (*JImageFindResource)(_jimage, module_name, get_jimage_version_string(), name, &size);
410 }
411 }
412 }
413 }
414 }
415 if (location != 0) {
416 if (UsePerfData) {
417 ClassLoader::perf_sys_classfile_bytes_read()->inc(size);
418 }
419 char* data = NEW_RESOURCE_ARRAY(char, size);
420 (*JImageGetResource)(_jimage, location, data, size);
421 // Resource allocated
422 assert(this == (ClassPathImageEntry*)ClassLoader::get_jrt_entry(), "must be");
423 return new ClassFileStream((u1*)data,
424 (int)size,
425 _name,
426 ClassFileStream::verify,
427 true); // from_boot_loader_modules_image
428 }
429
430 return NULL;
431 }
432
jimage_find_resource(JImageFile * jf,const char * module_name,const char * file_name,jlong & size)433 JImageLocationRef ClassLoader::jimage_find_resource(JImageFile* jf,
434 const char* module_name,
435 const char* file_name,
436 jlong &size) {
437 return ((*JImageFindResource)(jf, module_name, get_jimage_version_string(), file_name, &size));
438 }
439
is_modules_image() const440 bool ClassPathImageEntry::is_modules_image() const {
441 assert(this == _singleton, "VM supports a single jimage");
442 assert(this == (ClassPathImageEntry*)ClassLoader::get_jrt_entry(), "must be used for jrt entry");
443 return true;
444 }
445
446 #if INCLUDE_CDS
exit_with_path_failure(const char * error,const char * message)447 void ClassLoader::exit_with_path_failure(const char* error, const char* message) {
448 Arguments::assert_is_dumping_archive();
449 tty->print_cr("Hint: enable -Xlog:class+path=info to diagnose the failure");
450 vm_exit_during_initialization(error, message);
451 }
452 #endif
453
ModuleClassPathList(Symbol * module_name)454 ModuleClassPathList::ModuleClassPathList(Symbol* module_name) {
455 _module_name = module_name;
456 _module_first_entry = NULL;
457 _module_last_entry = NULL;
458 }
459
~ModuleClassPathList()460 ModuleClassPathList::~ModuleClassPathList() {
461 // Clean out each ClassPathEntry on list
462 ClassPathEntry* e = _module_first_entry;
463 while (e != NULL) {
464 ClassPathEntry* next_entry = e->next();
465 delete e;
466 e = next_entry;
467 }
468 }
469
add_to_list(ClassPathEntry * new_entry)470 void ModuleClassPathList::add_to_list(ClassPathEntry* new_entry) {
471 if (new_entry != NULL) {
472 if (_module_last_entry == NULL) {
473 _module_first_entry = _module_last_entry = new_entry;
474 } else {
475 _module_last_entry->set_next(new_entry);
476 _module_last_entry = new_entry;
477 }
478 }
479 }
480
trace_class_path(const char * msg,const char * name)481 void ClassLoader::trace_class_path(const char* msg, const char* name) {
482 LogTarget(Info, class, path) lt;
483 if (lt.is_enabled()) {
484 LogStream ls(lt);
485 if (msg) {
486 ls.print("%s", msg);
487 }
488 if (name) {
489 if (strlen(name) < 256) {
490 ls.print("%s", name);
491 } else {
492 // For very long paths, we need to print each character separately,
493 // as print_cr() has a length limit
494 while (name[0] != '\0') {
495 ls.print("%c", name[0]);
496 name++;
497 }
498 }
499 }
500 ls.cr();
501 }
502 }
503
setup_bootstrap_search_path()504 void ClassLoader::setup_bootstrap_search_path() {
505 const char* sys_class_path = Arguments::get_sysclasspath();
506 assert(sys_class_path != NULL, "System boot class path must not be NULL");
507 if (PrintSharedArchiveAndExit) {
508 // Don't print sys_class_path - this is the bootcp of this current VM process, not necessarily
509 // the same as the bootcp of the shared archive.
510 } else {
511 trace_class_path("bootstrap loader class path=", sys_class_path);
512 }
513 setup_boot_search_path(sys_class_path);
514 }
515
516 #if INCLUDE_CDS
setup_app_search_path(const char * class_path)517 void ClassLoader::setup_app_search_path(const char *class_path) {
518 Arguments::assert_is_dumping_archive();
519
520 ResourceMark rm;
521 ClasspathStream cp_stream(class_path);
522
523 while (cp_stream.has_next()) {
524 const char* path = cp_stream.get_next();
525 update_class_path_entry_list(path, false, false, false);
526 }
527 }
528
add_to_module_path_entries(const char * path,ClassPathEntry * entry)529 void ClassLoader::add_to_module_path_entries(const char* path,
530 ClassPathEntry* entry) {
531 assert(entry != NULL, "ClassPathEntry should not be NULL");
532 Arguments::assert_is_dumping_archive();
533
534 // The entry does not exist, add to the list
535 if (_module_path_entries == NULL) {
536 assert(_last_module_path_entry == NULL, "Sanity");
537 _module_path_entries = _last_module_path_entry = entry;
538 } else {
539 _last_module_path_entry->set_next(entry);
540 _last_module_path_entry = entry;
541 }
542 }
543
544 // Add a module path to the _module_path_entries list.
update_module_path_entry_list(const char * path,TRAPS)545 void ClassLoader::update_module_path_entry_list(const char *path, TRAPS) {
546 Arguments::assert_is_dumping_archive();
547 struct stat st;
548 if (os::stat(path, &st) != 0) {
549 tty->print_cr("os::stat error %d (%s). CDS dump aborted (path was \"%s\").",
550 errno, os::errno_name(errno), path);
551 vm_exit_during_initialization();
552 }
553 // File or directory found
554 ClassPathEntry* new_entry = NULL;
555 new_entry = create_class_path_entry(path, &st, true /* throw_exception */,
556 false /*is_boot_append */, false /* from_class_path_attr */, CHECK);
557 if (new_entry == NULL) {
558 return;
559 }
560
561 add_to_module_path_entries(path, new_entry);
562 return;
563 }
564
setup_module_search_path(const char * path,TRAPS)565 void ClassLoader::setup_module_search_path(const char* path, TRAPS) {
566 update_module_path_entry_list(path, THREAD);
567 }
568
569 #endif // INCLUDE_CDS
570
close_jrt_image()571 void ClassLoader::close_jrt_image() {
572 // Not applicable for exploded builds
573 if (!ClassLoader::has_jrt_entry()) return;
574 _jrt_entry->close_jimage();
575 }
576
577 // Construct the array of module/path pairs as specified to --patch-module
578 // for the boot loader to search ahead of the jimage, if the class being
579 // loaded is defined to a module that has been specified to --patch-module.
setup_patch_mod_entries()580 void ClassLoader::setup_patch_mod_entries() {
581 Thread* THREAD = Thread::current();
582 GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
583 int num_of_entries = patch_mod_args->length();
584
585 // Set up the boot loader's _patch_mod_entries list
586 _patch_mod_entries = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleClassPathList*>(num_of_entries, true);
587
588 for (int i = 0; i < num_of_entries; i++) {
589 const char* module_name = (patch_mod_args->at(i))->module_name();
590 Symbol* const module_sym = SymbolTable::new_symbol(module_name);
591 assert(module_sym != NULL, "Failed to obtain Symbol for module name");
592 ModuleClassPathList* module_cpl = new ModuleClassPathList(module_sym);
593
594 char* class_path = (patch_mod_args->at(i))->path_string();
595 ResourceMark rm(THREAD);
596 ClasspathStream cp_stream(class_path);
597
598 while (cp_stream.has_next()) {
599 const char* path = cp_stream.get_next();
600 struct stat st;
601 if (os::stat(path, &st) == 0) {
602 // File or directory found
603 ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, false, CHECK);
604 // If the path specification is valid, enter it into this module's list
605 if (new_entry != NULL) {
606 module_cpl->add_to_list(new_entry);
607 }
608 }
609 }
610
611 // Record the module into the list of --patch-module entries only if
612 // valid ClassPathEntrys have been created
613 if (module_cpl->module_first_entry() != NULL) {
614 _patch_mod_entries->push(module_cpl);
615 }
616 }
617 }
618
619 // Determine whether the module has been patched via the command-line
620 // option --patch-module
is_in_patch_mod_entries(Symbol * module_name)621 bool ClassLoader::is_in_patch_mod_entries(Symbol* module_name) {
622 if (_patch_mod_entries != NULL && _patch_mod_entries->is_nonempty()) {
623 int table_len = _patch_mod_entries->length();
624 for (int i = 0; i < table_len; i++) {
625 ModuleClassPathList* patch_mod = _patch_mod_entries->at(i);
626 if (module_name->fast_compare(patch_mod->module_name()) == 0) {
627 return true;
628 }
629 }
630 }
631 return false;
632 }
633
634 // Set up the _jrt_entry if present and boot append path
setup_boot_search_path(const char * class_path)635 void ClassLoader::setup_boot_search_path(const char *class_path) {
636 EXCEPTION_MARK;
637 ResourceMark rm(THREAD);
638 ClasspathStream cp_stream(class_path);
639 bool set_base_piece = true;
640
641 #if INCLUDE_CDS
642 if (Arguments::is_dumping_archive()) {
643 if (!Arguments::has_jimage()) {
644 vm_exit_during_initialization("CDS is not supported in exploded JDK build", NULL);
645 }
646 }
647 #endif
648
649 while (cp_stream.has_next()) {
650 const char* path = cp_stream.get_next();
651
652 if (set_base_piece) {
653 // The first time through the bootstrap_search setup, it must be determined
654 // what the base or core piece of the boot loader search is. Either a java runtime
655 // image is present or this is an exploded module build situation.
656 assert(string_ends_with(path, MODULES_IMAGE_NAME) || string_ends_with(path, JAVA_BASE_NAME),
657 "Incorrect boot loader search path, no java runtime image or " JAVA_BASE_NAME " exploded build");
658 struct stat st;
659 if (os::stat(path, &st) == 0) {
660 // Directory found
661 ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, false, CHECK);
662
663 // Check for a jimage
664 if (Arguments::has_jimage()) {
665 assert(_jrt_entry == NULL, "should not setup bootstrap class search path twice");
666 _jrt_entry = new_entry;
667 assert(new_entry != NULL && new_entry->is_modules_image(), "No java runtime image present");
668 assert(_jrt_entry->jimage() != NULL, "No java runtime image");
669 }
670 } else {
671 // If path does not exist, exit
672 vm_exit_during_initialization("Unable to establish the boot loader search path", path);
673 }
674 set_base_piece = false;
675 } else {
676 // Every entry on the system boot class path after the initial base piece,
677 // which is set by os::set_boot_path(), is considered an appended entry.
678 update_class_path_entry_list(path, false, true, false);
679 }
680 }
681 }
682
683 // During an exploded modules build, each module defined to the boot loader
684 // will be added to the ClassLoader::_exploded_entries array.
add_to_exploded_build_list(Symbol * module_sym,TRAPS)685 void ClassLoader::add_to_exploded_build_list(Symbol* module_sym, TRAPS) {
686 assert(!ClassLoader::has_jrt_entry(), "Exploded build not applicable");
687 assert(_exploded_entries != NULL, "_exploded_entries was not initialized");
688
689 // Find the module's symbol
690 ResourceMark rm(THREAD);
691 const char *module_name = module_sym->as_C_string();
692 const char *home = Arguments::get_java_home();
693 const char file_sep = os::file_separator()[0];
694 // 10 represents the length of "modules" + 2 file separators + \0
695 size_t len = strlen(home) + strlen(module_name) + 10;
696 char *path = NEW_RESOURCE_ARRAY(char, len);
697 jio_snprintf(path, len, "%s%cmodules%c%s", home, file_sep, file_sep, module_name);
698
699 struct stat st;
700 if (os::stat(path, &st) == 0) {
701 // Directory found
702 ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, false, CHECK);
703
704 // If the path specification is valid, enter it into this module's list.
705 // There is no need to check for duplicate modules in the exploded entry list,
706 // since no two modules with the same name can be defined to the boot loader.
707 // This is checked at module definition time in Modules::define_module.
708 if (new_entry != NULL) {
709 ModuleClassPathList* module_cpl = new ModuleClassPathList(module_sym);
710 module_cpl->add_to_list(new_entry);
711 {
712 MutexLocker ml(THREAD, Module_lock);
713 _exploded_entries->push(module_cpl);
714 }
715 log_info(class, load)("path: %s", path);
716 }
717 }
718 }
719
create_class_path_entry(const char * path,const struct stat * st,bool throw_exception,bool is_boot_append,bool from_class_path_attr,TRAPS)720 ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const struct stat* st,
721 bool throw_exception,
722 bool is_boot_append,
723 bool from_class_path_attr,
724 TRAPS) {
725 JavaThread* thread = JavaThread::current();
726 ClassPathEntry* new_entry = NULL;
727 if ((st->st_mode & S_IFMT) == S_IFREG) {
728 ResourceMark rm(thread);
729 // Regular file, should be a zip or jimage file
730 // Canonicalized filename
731 char* canonical_path = NEW_RESOURCE_ARRAY_IN_THREAD(thread, char, JVM_MAXPATHLEN);
732 if (!get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) {
733 // This matches the classic VM
734 if (throw_exception) {
735 THROW_MSG_(vmSymbols::java_io_IOException(), "Bad pathname", NULL);
736 } else {
737 return NULL;
738 }
739 }
740 jint error;
741 JImageFile* jimage =(*JImageOpen)(canonical_path, &error);
742 if (jimage != NULL) {
743 new_entry = new ClassPathImageEntry(jimage, canonical_path);
744 } else {
745 char* error_msg = NULL;
746 jzfile* zip;
747 {
748 // enable call to C land
749 ThreadToNativeFromVM ttn(thread);
750 HandleMark hm(thread);
751 load_zip_library_if_needed();
752 zip = (*ZipOpen)(canonical_path, &error_msg);
753 }
754 if (zip != NULL && error_msg == NULL) {
755 new_entry = new ClassPathZipEntry(zip, path, is_boot_append, from_class_path_attr);
756 } else {
757 char *msg;
758 if (error_msg == NULL) {
759 msg = NEW_RESOURCE_ARRAY_IN_THREAD(thread, char, strlen(path) + 128); ;
760 jio_snprintf(msg, strlen(path) + 127, "error in opening JAR file %s", path);
761 } else {
762 int len = (int)(strlen(path) + strlen(error_msg) + 128);
763 msg = NEW_RESOURCE_ARRAY_IN_THREAD(thread, char, len); ;
764 jio_snprintf(msg, len - 1, "error in opening JAR file <%s> %s", error_msg, path);
765 }
766 // Don't complain about bad jar files added via -Xbootclasspath/a:.
767 if (throw_exception && is_init_completed()) {
768 THROW_MSG_(vmSymbols::java_lang_ClassNotFoundException(), msg, NULL);
769 } else {
770 return NULL;
771 }
772 }
773 }
774 log_info(class, path)("opened: %s", path);
775 log_info(class, load)("opened: %s", path);
776 } else {
777 // Directory
778 new_entry = new ClassPathDirEntry(path);
779 log_info(class, load)("path: %s", path);
780 }
781 return new_entry;
782 }
783
784
785 // Create a class path zip entry for a given path (return NULL if not found
786 // or zip/JAR file cannot be opened)
create_class_path_zip_entry(const char * path,bool is_boot_append)787 ClassPathZipEntry* ClassLoader::create_class_path_zip_entry(const char *path, bool is_boot_append) {
788 // check for a regular file
789 struct stat st;
790 if (os::stat(path, &st) == 0) {
791 if ((st.st_mode & S_IFMT) == S_IFREG) {
792 char canonical_path[JVM_MAXPATHLEN];
793 if (get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) {
794 char* error_msg = NULL;
795 jzfile* zip;
796 {
797 // enable call to C land
798 JavaThread* thread = JavaThread::current();
799 ThreadToNativeFromVM ttn(thread);
800 HandleMark hm(thread);
801 load_zip_library_if_needed();
802 zip = (*ZipOpen)(canonical_path, &error_msg);
803 }
804 if (zip != NULL && error_msg == NULL) {
805 // create using canonical path
806 return new ClassPathZipEntry(zip, canonical_path, is_boot_append, false);
807 }
808 }
809 }
810 }
811 return NULL;
812 }
813
814 // returns true if entry already on class path
contains_append_entry(const char * name)815 bool ClassLoader::contains_append_entry(const char* name) {
816 ClassPathEntry* e = _first_append_entry;
817 while (e != NULL) {
818 // assume zip entries have been canonicalized
819 if (strcmp(name, e->name()) == 0) {
820 return true;
821 }
822 e = e->next();
823 }
824 return false;
825 }
826
add_to_boot_append_entries(ClassPathEntry * new_entry)827 void ClassLoader::add_to_boot_append_entries(ClassPathEntry *new_entry) {
828 if (new_entry != NULL) {
829 if (_last_append_entry == NULL) {
830 assert(_first_append_entry == NULL, "boot loader's append class path entry list not empty");
831 _first_append_entry = _last_append_entry = new_entry;
832 } else {
833 _last_append_entry->set_next(new_entry);
834 _last_append_entry = new_entry;
835 }
836 }
837 }
838
839 // Record the path entries specified in -cp during dump time. The recorded
840 // information will be used at runtime for loading the archived app classes.
841 //
842 // Note that at dump time, ClassLoader::_app_classpath_entries are NOT used for
843 // loading app classes. Instead, the app class are loaded by the
844 // jdk/internal/loader/ClassLoaders$AppClassLoader instance.
add_to_app_classpath_entries(const char * path,ClassPathEntry * entry,bool check_for_duplicates)845 void ClassLoader::add_to_app_classpath_entries(const char* path,
846 ClassPathEntry* entry,
847 bool check_for_duplicates) {
848 #if INCLUDE_CDS
849 assert(entry != NULL, "ClassPathEntry should not be NULL");
850 ClassPathEntry* e = _app_classpath_entries;
851 if (check_for_duplicates) {
852 while (e != NULL) {
853 if (strcmp(e->name(), entry->name()) == 0) {
854 // entry already exists
855 return;
856 }
857 e = e->next();
858 }
859 }
860
861 // The entry does not exist, add to the list
862 if (_app_classpath_entries == NULL) {
863 assert(_last_app_classpath_entry == NULL, "Sanity");
864 _app_classpath_entries = _last_app_classpath_entry = entry;
865 } else {
866 _last_app_classpath_entry->set_next(entry);
867 _last_app_classpath_entry = entry;
868 }
869
870 if (entry->is_jar_file()) {
871 ClassLoaderExt::process_jar_manifest(entry, check_for_duplicates);
872 }
873 #endif
874 }
875
876 // Returns true IFF the file/dir exists and the entry was successfully created.
update_class_path_entry_list(const char * path,bool check_for_duplicates,bool is_boot_append,bool from_class_path_attr,bool throw_exception)877 bool ClassLoader::update_class_path_entry_list(const char *path,
878 bool check_for_duplicates,
879 bool is_boot_append,
880 bool from_class_path_attr,
881 bool throw_exception) {
882 struct stat st;
883 if (os::stat(path, &st) == 0) {
884 // File or directory found
885 ClassPathEntry* new_entry = NULL;
886 Thread* THREAD = Thread::current();
887 new_entry = create_class_path_entry(path, &st, throw_exception, is_boot_append, from_class_path_attr, CHECK_(false));
888 if (new_entry == NULL) {
889 return false;
890 }
891
892 // Do not reorder the bootclasspath which would break get_system_package().
893 // Add new entry to linked list
894 if (is_boot_append) {
895 add_to_boot_append_entries(new_entry);
896 } else {
897 add_to_app_classpath_entries(path, new_entry, check_for_duplicates);
898 }
899 return true;
900 } else {
901 return false;
902 }
903 }
904
print_module_entry_table(const GrowableArray<ModuleClassPathList * > * const module_list)905 static void print_module_entry_table(const GrowableArray<ModuleClassPathList*>* const module_list) {
906 ResourceMark rm;
907 int num_of_entries = module_list->length();
908 for (int i = 0; i < num_of_entries; i++) {
909 ClassPathEntry* e;
910 ModuleClassPathList* mpl = module_list->at(i);
911 tty->print("%s=", mpl->module_name()->as_C_string());
912 e = mpl->module_first_entry();
913 while (e != NULL) {
914 tty->print("%s", e->name());
915 e = e->next();
916 if (e != NULL) {
917 tty->print("%s", os::path_separator());
918 }
919 }
920 tty->print(" ;");
921 }
922 }
923
print_bootclasspath()924 void ClassLoader::print_bootclasspath() {
925 ClassPathEntry* e;
926 tty->print("[bootclasspath= ");
927
928 // Print --patch-module module/path specifications first
929 if (_patch_mod_entries != NULL) {
930 print_module_entry_table(_patch_mod_entries);
931 }
932
933 // [jimage | exploded modules build]
934 if (has_jrt_entry()) {
935 // Print the location of the java runtime image
936 tty->print("%s ;", _jrt_entry->name());
937 } else {
938 // Print exploded module build path specifications
939 if (_exploded_entries != NULL) {
940 print_module_entry_table(_exploded_entries);
941 }
942 }
943
944 // appended entries
945 e = _first_append_entry;
946 while (e != NULL) {
947 tty->print("%s ;", e->name());
948 e = e->next();
949 }
950 tty->print_cr("]");
951 }
952
dll_lookup(void * lib,const char * name,const char * path)953 void* ClassLoader::dll_lookup(void* lib, const char* name, const char* path) {
954 void* func = os::dll_lookup(lib, name);
955 if (func == NULL) {
956 char msg[256] = "";
957 jio_snprintf(msg, sizeof(msg), "Could not resolve \"%s\"", name);
958 vm_exit_during_initialization(msg, path);
959 }
960 return func;
961 }
962
load_java_library()963 void ClassLoader::load_java_library() {
964 assert(CanonicalizeEntry == NULL, "should not load java library twice");
965 void *javalib_handle = os::native_java_library();
966 if (javalib_handle == NULL) {
967 vm_exit_during_initialization("Unable to load java library", NULL);
968 }
969
970 CanonicalizeEntry = CAST_TO_FN_PTR(canonicalize_fn_t, dll_lookup(javalib_handle, "JDK_Canonicalize", NULL));
971 }
972
release_load_zip_library()973 void ClassLoader::release_load_zip_library() {
974 MutexLocker locker(Zip_lock, Monitor::_no_safepoint_check_flag);
975 if (_libzip_loaded == 0) {
976 load_zip_library();
977 Atomic::release_store(&_libzip_loaded, 1);
978 }
979 }
980
load_zip_library()981 void ClassLoader::load_zip_library() {
982 assert(ZipOpen == NULL, "should not load zip library twice");
983 char path[JVM_MAXPATHLEN];
984 char ebuf[1024];
985 void* handle = NULL;
986 if (os::dll_locate_lib(path, sizeof(path), Arguments::get_dll_dir(), "zip")) {
987 handle = os::dll_load(path, ebuf, sizeof ebuf);
988 }
989 if (handle == NULL) {
990 vm_exit_during_initialization("Unable to load zip library", path);
991 }
992
993 ZipOpen = CAST_TO_FN_PTR(ZipOpen_t, dll_lookup(handle, "ZIP_Open", path));
994 ZipClose = CAST_TO_FN_PTR(ZipClose_t, dll_lookup(handle, "ZIP_Close", path));
995 FindEntry = CAST_TO_FN_PTR(FindEntry_t, dll_lookup(handle, "ZIP_FindEntry", path));
996 ReadEntry = CAST_TO_FN_PTR(ReadEntry_t, dll_lookup(handle, "ZIP_ReadEntry", path));
997 GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, dll_lookup(handle, "ZIP_GetNextEntry", path));
998 Crc32 = CAST_TO_FN_PTR(Crc32_t, dll_lookup(handle, "ZIP_CRC32", path));
999 }
1000
load_jimage_library()1001 void ClassLoader::load_jimage_library() {
1002 assert(JImageOpen == NULL, "should not load jimage library twice");
1003 char path[JVM_MAXPATHLEN];
1004 char ebuf[1024];
1005 void* handle = NULL;
1006 if (os::dll_locate_lib(path, sizeof(path), Arguments::get_dll_dir(), "jimage")) {
1007 handle = os::dll_load(path, ebuf, sizeof ebuf);
1008 }
1009 if (handle == NULL) {
1010 vm_exit_during_initialization("Unable to load jimage library", path);
1011 }
1012
1013 JImageOpen = CAST_TO_FN_PTR(JImageOpen_t, dll_lookup(handle, "JIMAGE_Open", path));
1014 JImageClose = CAST_TO_FN_PTR(JImageClose_t, dll_lookup(handle, "JIMAGE_Close", path));
1015 JImagePackageToModule = CAST_TO_FN_PTR(JImagePackageToModule_t, dll_lookup(handle, "JIMAGE_PackageToModule", path));
1016 JImageFindResource = CAST_TO_FN_PTR(JImageFindResource_t, dll_lookup(handle, "JIMAGE_FindResource", path));
1017 JImageGetResource = CAST_TO_FN_PTR(JImageGetResource_t, dll_lookup(handle, "JIMAGE_GetResource", path));
1018 JImageResourceIterator = CAST_TO_FN_PTR(JImageResourceIterator_t, dll_lookup(handle, "JIMAGE_ResourceIterator", path));
1019 }
1020
crc32(int crc,const char * buf,int len)1021 int ClassLoader::crc32(int crc, const char* buf, int len) {
1022 load_zip_library_if_needed();
1023 return (*Crc32)(crc, (const jbyte*)buf, len);
1024 }
1025
get_system_package(const char * name,TRAPS)1026 oop ClassLoader::get_system_package(const char* name, TRAPS) {
1027 // Look up the name in the boot loader's package entry table.
1028 if (name != NULL) {
1029 TempNewSymbol package_sym = SymbolTable::new_symbol(name);
1030 // Look for the package entry in the boot loader's package entry table.
1031 PackageEntry* package =
1032 ClassLoaderData::the_null_class_loader_data()->packages()->lookup_only(package_sym);
1033
1034 // Return NULL if package does not exist or if no classes in that package
1035 // have been loaded.
1036 if (package != NULL && package->has_loaded_class()) {
1037 ModuleEntry* module = package->module();
1038 if (module->location() != NULL) {
1039 ResourceMark rm(THREAD);
1040 Handle ml = java_lang_String::create_from_str(
1041 module->location()->as_C_string(), THREAD);
1042 return ml();
1043 }
1044 // Return entry on boot loader class path.
1045 Handle cph = java_lang_String::create_from_str(
1046 ClassLoader::classpath_entry(package->classpath_index())->name(), THREAD);
1047 return cph();
1048 }
1049 }
1050 return NULL;
1051 }
1052
get_system_packages(TRAPS)1053 objArrayOop ClassLoader::get_system_packages(TRAPS) {
1054 ResourceMark rm(THREAD);
1055 // List of pointers to PackageEntrys that have loaded classes.
1056 GrowableArray<PackageEntry*>* loaded_class_pkgs = new GrowableArray<PackageEntry*>(50);
1057 {
1058 MutexLocker ml(THREAD, Module_lock);
1059
1060 PackageEntryTable* pe_table =
1061 ClassLoaderData::the_null_class_loader_data()->packages();
1062
1063 // Collect the packages that have at least one loaded class.
1064 for (int x = 0; x < pe_table->table_size(); x++) {
1065 for (PackageEntry* package_entry = pe_table->bucket(x);
1066 package_entry != NULL;
1067 package_entry = package_entry->next()) {
1068 if (package_entry->has_loaded_class()) {
1069 loaded_class_pkgs->append(package_entry);
1070 }
1071 }
1072 }
1073 }
1074
1075
1076 // Allocate objArray and fill with java.lang.String
1077 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
1078 loaded_class_pkgs->length(), CHECK_NULL);
1079 objArrayHandle result(THREAD, r);
1080 for (int x = 0; x < loaded_class_pkgs->length(); x++) {
1081 PackageEntry* package_entry = loaded_class_pkgs->at(x);
1082 Handle str = java_lang_String::create_from_symbol(package_entry->name(), CHECK_NULL);
1083 result->obj_at_put(x, str());
1084 }
1085 return result();
1086 }
1087
1088 // caller needs ResourceMark
file_name_for_class_name(const char * class_name,int class_name_len)1089 const char* ClassLoader::file_name_for_class_name(const char* class_name,
1090 int class_name_len) {
1091 assert(class_name != NULL, "invariant");
1092 assert((int)strlen(class_name) == class_name_len, "invariant");
1093
1094 static const char class_suffix[] = ".class";
1095 size_t class_suffix_len = sizeof(class_suffix);
1096
1097 char* const file_name = NEW_RESOURCE_ARRAY(char,
1098 class_name_len +
1099 class_suffix_len); // includes term NULL
1100
1101 strncpy(file_name, class_name, class_name_len);
1102 strncpy(&file_name[class_name_len], class_suffix, class_suffix_len);
1103
1104 return file_name;
1105 }
1106
find_first_module_cpe(ModuleEntry * mod_entry,const GrowableArray<ModuleClassPathList * > * const module_list)1107 ClassPathEntry* find_first_module_cpe(ModuleEntry* mod_entry,
1108 const GrowableArray<ModuleClassPathList*>* const module_list) {
1109 int num_of_entries = module_list->length();
1110 const Symbol* class_module_name = mod_entry->name();
1111
1112 // Loop through all the modules in either the patch-module or exploded entries looking for module
1113 for (int i = 0; i < num_of_entries; i++) {
1114 ModuleClassPathList* module_cpl = module_list->at(i);
1115 Symbol* module_cpl_name = module_cpl->module_name();
1116
1117 if (module_cpl_name->fast_compare(class_module_name) == 0) {
1118 // Class' module has been located.
1119 return module_cpl->module_first_entry();
1120 }
1121 }
1122 return NULL;
1123 }
1124
1125
1126 // Search either the patch-module or exploded build entries for class.
search_module_entries(const GrowableArray<ModuleClassPathList * > * const module_list,const char * const class_name,const char * const file_name,TRAPS)1127 ClassFileStream* ClassLoader::search_module_entries(const GrowableArray<ModuleClassPathList*>* const module_list,
1128 const char* const class_name,
1129 const char* const file_name,
1130 TRAPS) {
1131 ClassFileStream* stream = NULL;
1132
1133 // Find the class' defining module in the boot loader's module entry table
1134 TempNewSymbol class_name_symbol = SymbolTable::new_symbol(class_name);
1135 TempNewSymbol pkg_name = package_from_class_name(class_name_symbol);
1136 PackageEntry* pkg_entry = get_package_entry(pkg_name, ClassLoaderData::the_null_class_loader_data());
1137 ModuleEntry* mod_entry = (pkg_entry != NULL) ? pkg_entry->module() : NULL;
1138
1139 // If the module system has not defined java.base yet, then
1140 // classes loaded are assumed to be defined to java.base.
1141 // When java.base is eventually defined by the module system,
1142 // all packages of classes that have been previously loaded
1143 // are verified in ModuleEntryTable::verify_javabase_packages().
1144 if (!Universe::is_module_initialized() &&
1145 !ModuleEntryTable::javabase_defined() &&
1146 mod_entry == NULL) {
1147 mod_entry = ModuleEntryTable::javabase_moduleEntry();
1148 }
1149
1150 // The module must be a named module
1151 ClassPathEntry* e = NULL;
1152 if (mod_entry != NULL && mod_entry->is_named()) {
1153 if (module_list == _exploded_entries) {
1154 // The exploded build entries can be added to at any time so a lock is
1155 // needed when searching them.
1156 assert(!ClassLoader::has_jrt_entry(), "Must be exploded build");
1157 MutexLocker ml(THREAD, Module_lock);
1158 e = find_first_module_cpe(mod_entry, module_list);
1159 } else {
1160 e = find_first_module_cpe(mod_entry, module_list);
1161 }
1162 }
1163
1164 // Try to load the class from the module's ClassPathEntry list.
1165 while (e != NULL) {
1166 stream = e->open_stream(file_name, CHECK_NULL);
1167 // No context.check is required since CDS is not supported
1168 // for an exploded modules build or if --patch-module is specified.
1169 if (NULL != stream) {
1170 return stream;
1171 }
1172 e = e->next();
1173 }
1174 // If the module was located, break out even if the class was not
1175 // located successfully from that module's ClassPathEntry list.
1176 // There will not be another valid entry for that module.
1177 return NULL;
1178 }
1179
1180 // Called by the boot classloader to load classes
load_class(Symbol * name,bool search_append_only,TRAPS)1181 InstanceKlass* ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) {
1182 assert(name != NULL, "invariant");
1183 assert(THREAD->is_Java_thread(), "must be a JavaThread");
1184
1185 ResourceMark rm(THREAD);
1186 HandleMark hm(THREAD);
1187
1188 const char* const class_name = name->as_C_string();
1189
1190 EventMark m("loading class %s", class_name);
1191
1192 const char* const file_name = file_name_for_class_name(class_name,
1193 name->utf8_length());
1194 assert(file_name != NULL, "invariant");
1195
1196 // Lookup stream for parsing .class file
1197 ClassFileStream* stream = NULL;
1198 s2 classpath_index = 0;
1199 ClassPathEntry* e = NULL;
1200
1201 // If search_append_only is true, boot loader visibility boundaries are
1202 // set to be _first_append_entry to the end. This includes:
1203 // [-Xbootclasspath/a]; [jvmti appended entries]
1204 //
1205 // If search_append_only is false, boot loader visibility boundaries are
1206 // set to be the --patch-module entries plus the base piece. This includes:
1207 // [--patch-module=<module>=<file>(<pathsep><file>)*]; [jimage | exploded module build]
1208 //
1209
1210 // Load Attempt #1: --patch-module
1211 // Determine the class' defining module. If it appears in the _patch_mod_entries,
1212 // attempt to load the class from those locations specific to the module.
1213 // Specifications to --patch-module can contain a partial number of classes
1214 // that are part of the overall module definition. So if a particular class is not
1215 // found within its module specification, the search should continue to Load Attempt #2.
1216 // Note: The --patch-module entries are never searched if the boot loader's
1217 // visibility boundary is limited to only searching the append entries.
1218 if (_patch_mod_entries != NULL && !search_append_only) {
1219 // At CDS dump time, the --patch-module entries are ignored. That means a
1220 // class is still loaded from the runtime image even if it might
1221 // appear in the _patch_mod_entries. The runtime shared class visibility
1222 // check will determine if a shared class is visible based on the runtime
1223 // environemnt, including the runtime --patch-module setting.
1224 //
1225 // DynamicDumpSharedSpaces requires UseSharedSpaces to be enabled. Since --patch-module
1226 // is not supported with UseSharedSpaces, it is not supported with DynamicDumpSharedSpaces.
1227 assert(!DynamicDumpSharedSpaces, "sanity");
1228 if (!DumpSharedSpaces) {
1229 stream = search_module_entries(_patch_mod_entries, class_name, file_name, CHECK_NULL);
1230 }
1231 }
1232
1233 // Load Attempt #2: [jimage | exploded build]
1234 if (!search_append_only && (NULL == stream)) {
1235 if (has_jrt_entry()) {
1236 e = _jrt_entry;
1237 stream = _jrt_entry->open_stream(file_name, CHECK_NULL);
1238 } else {
1239 // Exploded build - attempt to locate class in its defining module's location.
1240 assert(_exploded_entries != NULL, "No exploded build entries present");
1241 stream = search_module_entries(_exploded_entries, class_name, file_name, CHECK_NULL);
1242 }
1243 }
1244
1245 // Load Attempt #3: [-Xbootclasspath/a]; [jvmti appended entries]
1246 if (search_append_only && (NULL == stream)) {
1247 // For the boot loader append path search, the starting classpath_index
1248 // for the appended piece is always 1 to account for either the
1249 // _jrt_entry or the _exploded_entries.
1250 assert(classpath_index == 0, "The classpath_index has been incremented incorrectly");
1251 classpath_index = 1;
1252
1253 e = _first_append_entry;
1254 while (e != NULL) {
1255 stream = e->open_stream(file_name, CHECK_NULL);
1256 if (NULL != stream) {
1257 break;
1258 }
1259 e = e->next();
1260 ++classpath_index;
1261 }
1262 }
1263
1264 if (NULL == stream) {
1265 return NULL;
1266 }
1267
1268 stream->set_verify(ClassLoaderExt::should_verify(classpath_index));
1269
1270 ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
1271 Handle protection_domain;
1272 ClassLoadInfo cl_info(protection_domain);
1273
1274 InstanceKlass* result = KlassFactory::create_from_stream(stream,
1275 name,
1276 loader_data,
1277 cl_info,
1278 THREAD);
1279 if (HAS_PENDING_EXCEPTION) {
1280 if (DumpSharedSpaces) {
1281 log_error(cds)("Preload Error: Failed to load %s", class_name);
1282 }
1283 return NULL;
1284 }
1285
1286 result->set_classpath_index(classpath_index, THREAD);
1287 return result;
1288 }
1289
1290 #if INCLUDE_CDS
skip_uri_protocol(char * source)1291 char* ClassLoader::skip_uri_protocol(char* source) {
1292 if (strncmp(source, "file:", 5) == 0) {
1293 // file: protocol path could start with file:/ or file:///
1294 // locate the char after all the forward slashes
1295 int offset = 5;
1296 while (*(source + offset) == '/') {
1297 offset++;
1298 }
1299 source += offset;
1300 // for non-windows platforms, move back one char as the path begins with a '/'
1301 #ifndef _WINDOWS
1302 source -= 1;
1303 #endif
1304 } else if (strncmp(source, "jrt:/", 5) == 0) {
1305 source += 5;
1306 }
1307 return source;
1308 }
1309
1310 // Record the shared classpath index and loader type for classes loaded
1311 // by the builtin loaders at dump time.
record_result(InstanceKlass * ik,const ClassFileStream * stream,TRAPS)1312 void ClassLoader::record_result(InstanceKlass* ik, const ClassFileStream* stream, TRAPS) {
1313 Arguments::assert_is_dumping_archive();
1314 assert(stream != NULL, "sanity");
1315
1316 if (ik->is_hidden() || ik->is_unsafe_anonymous()) {
1317 // We do not archive hidden or unsafe anonymous classes.
1318 return;
1319 }
1320
1321 oop loader = ik->class_loader();
1322 char* src = (char*)stream->source();
1323 if (src == NULL) {
1324 if (loader == NULL) {
1325 // JFR classes
1326 ik->set_shared_classpath_index(0);
1327 ik->set_shared_class_loader_type(ClassLoader::BOOT_LOADER);
1328 }
1329 return;
1330 }
1331
1332 assert(has_jrt_entry(), "CDS dumping does not support exploded JDK build");
1333
1334 ResourceMark rm(THREAD);
1335 int classpath_index = -1;
1336 PackageEntry* pkg_entry = ik->package();
1337
1338 if (FileMapInfo::get_number_of_shared_paths() > 0) {
1339 char* canonical_path_table_entry = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JVM_MAXPATHLEN);
1340
1341 // save the path from the file: protocol or the module name from the jrt: protocol
1342 // if no protocol prefix is found, path is the same as stream->source()
1343 char* path = skip_uri_protocol(src);
1344 char* canonical_class_src_path = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JVM_MAXPATHLEN);
1345 bool success = get_canonical_path(path, canonical_class_src_path, JVM_MAXPATHLEN);
1346 // The path is from the ClassFileStream. Since a ClassFileStream has been created successfully in functions
1347 // such as ClassLoader::load_class(), its source path must be valid.
1348 assert(success, "must be valid path");
1349 for (int i = 0; i < FileMapInfo::get_number_of_shared_paths(); i++) {
1350 SharedClassPathEntry* ent = FileMapInfo::shared_path(i);
1351 success = get_canonical_path(ent->name(), canonical_path_table_entry, JVM_MAXPATHLEN);
1352 // A shared path has been validated during its creation in ClassLoader::create_class_path_entry(),
1353 // it must be valid here.
1354 assert(success, "must be valid path");
1355 // If the path (from the class stream source) is the same as the shared
1356 // class or module path, then we have a match.
1357 if (strcmp(canonical_path_table_entry, canonical_class_src_path) == 0) {
1358 // NULL pkg_entry and pkg_entry in an unnamed module implies the class
1359 // is from the -cp or boot loader append path which consists of -Xbootclasspath/a
1360 // and jvmti appended entries.
1361 if ((pkg_entry == NULL) || (pkg_entry->in_unnamed_module())) {
1362 // Ensure the index is within the -cp range before assigning
1363 // to the classpath_index.
1364 if (SystemDictionary::is_system_class_loader(loader) &&
1365 (i >= ClassLoaderExt::app_class_paths_start_index()) &&
1366 (i < ClassLoaderExt::app_module_paths_start_index())) {
1367 classpath_index = i;
1368 break;
1369 } else {
1370 if ((i >= 1) &&
1371 (i < ClassLoaderExt::app_class_paths_start_index())) {
1372 // The class must be from boot loader append path which consists of
1373 // -Xbootclasspath/a and jvmti appended entries.
1374 assert(loader == NULL, "sanity");
1375 classpath_index = i;
1376 break;
1377 }
1378 }
1379 } else {
1380 // A class from a named module from the --module-path. Ensure the index is
1381 // within the --module-path range before assigning to the classpath_index.
1382 if ((pkg_entry != NULL) && !(pkg_entry->in_unnamed_module()) && (i > 0)) {
1383 if (i >= ClassLoaderExt::app_module_paths_start_index() &&
1384 i < FileMapInfo::get_number_of_shared_paths()) {
1385 classpath_index = i;
1386 break;
1387 }
1388 }
1389 }
1390 }
1391 // for index 0 and the stream->source() is the modules image or has the jrt: protocol.
1392 // The class must be from the runtime modules image.
1393 if (i == 0 && (stream->from_boot_loader_modules_image() || string_starts_with(src, "jrt:"))) {
1394 classpath_index = i;
1395 break;
1396 }
1397 }
1398
1399 // No path entry found for this class. Must be a shared class loaded by the
1400 // user defined classloader.
1401 if (classpath_index < 0) {
1402 assert(ik->shared_classpath_index() < 0, "Sanity");
1403 ik->set_shared_classpath_index(UNREGISTERED_INDEX);
1404 SystemDictionaryShared::set_shared_class_misc_info(ik, (ClassFileStream*)stream);
1405 return;
1406 }
1407 } else {
1408 // The shared path table is set up after module system initialization.
1409 // The path table contains no entry before that. Any classes loaded prior
1410 // to the setup of the shared path table must be from the modules image.
1411 assert(stream->from_boot_loader_modules_image(), "stream must be loaded by boot loader from modules image");
1412 assert(FileMapInfo::get_number_of_shared_paths() == 0, "shared path table must not have been setup");
1413 classpath_index = 0;
1414 }
1415
1416 const char* const class_name = ik->name()->as_C_string();
1417 const char* const file_name = file_name_for_class_name(class_name,
1418 ik->name()->utf8_length());
1419 assert(file_name != NULL, "invariant");
1420
1421 ClassLoaderExt::record_result(classpath_index, ik, THREAD);
1422 }
1423 #endif // INCLUDE_CDS
1424
1425 // Initialize the class loader's access to methods in libzip. Parse and
1426 // process the boot classpath into a list ClassPathEntry objects. Once
1427 // this list has been created, it must not change order (see class PackageInfo)
1428 // it can be appended to and is by jvmti and the kernel vm.
1429
initialize()1430 void ClassLoader::initialize() {
1431 EXCEPTION_MARK;
1432
1433 if (UsePerfData) {
1434 // jvmstat performance counters
1435 NEWPERFTICKCOUNTER(_perf_accumulated_time, SUN_CLS, "time");
1436 NEWPERFTICKCOUNTER(_perf_class_init_time, SUN_CLS, "classInitTime");
1437 NEWPERFTICKCOUNTER(_perf_class_init_selftime, SUN_CLS, "classInitTime.self");
1438 NEWPERFTICKCOUNTER(_perf_class_verify_time, SUN_CLS, "classVerifyTime");
1439 NEWPERFTICKCOUNTER(_perf_class_verify_selftime, SUN_CLS, "classVerifyTime.self");
1440 NEWPERFTICKCOUNTER(_perf_class_link_time, SUN_CLS, "classLinkedTime");
1441 NEWPERFTICKCOUNTER(_perf_class_link_selftime, SUN_CLS, "classLinkedTime.self");
1442 NEWPERFEVENTCOUNTER(_perf_classes_inited, SUN_CLS, "initializedClasses");
1443 NEWPERFEVENTCOUNTER(_perf_classes_linked, SUN_CLS, "linkedClasses");
1444 NEWPERFEVENTCOUNTER(_perf_classes_verified, SUN_CLS, "verifiedClasses");
1445
1446 NEWPERFTICKCOUNTER(_perf_sys_class_lookup_time, SUN_CLS, "lookupSysClassTime");
1447 NEWPERFTICKCOUNTER(_perf_shared_classload_time, SUN_CLS, "sharedClassLoadTime");
1448 NEWPERFTICKCOUNTER(_perf_sys_classload_time, SUN_CLS, "sysClassLoadTime");
1449 NEWPERFTICKCOUNTER(_perf_app_classload_time, SUN_CLS, "appClassLoadTime");
1450 NEWPERFTICKCOUNTER(_perf_app_classload_selftime, SUN_CLS, "appClassLoadTime.self");
1451 NEWPERFEVENTCOUNTER(_perf_app_classload_count, SUN_CLS, "appClassLoadCount");
1452 NEWPERFTICKCOUNTER(_perf_define_appclasses, SUN_CLS, "defineAppClasses");
1453 NEWPERFTICKCOUNTER(_perf_define_appclass_time, SUN_CLS, "defineAppClassTime");
1454 NEWPERFTICKCOUNTER(_perf_define_appclass_selftime, SUN_CLS, "defineAppClassTime.self");
1455 NEWPERFBYTECOUNTER(_perf_app_classfile_bytes_read, SUN_CLS, "appClassBytes");
1456 NEWPERFBYTECOUNTER(_perf_sys_classfile_bytes_read, SUN_CLS, "sysClassBytes");
1457
1458
1459 // The following performance counters are added for measuring the impact
1460 // of the bug fix of 6365597. They are mainly focused on finding out
1461 // the behavior of system & user-defined classloader lock, whether
1462 // ClassLoader.loadClass/findClass is being called synchronized or not.
1463 NEWPERFEVENTCOUNTER(_sync_systemLoaderLockContentionRate, SUN_CLS,
1464 "systemLoaderLockContentionRate");
1465 NEWPERFEVENTCOUNTER(_sync_nonSystemLoaderLockContentionRate, SUN_CLS,
1466 "nonSystemLoaderLockContentionRate");
1467 NEWPERFEVENTCOUNTER(_sync_JVMFindLoadedClassLockFreeCounter, SUN_CLS,
1468 "jvmFindLoadedClassNoLockCalls");
1469 NEWPERFEVENTCOUNTER(_sync_JVMDefineClassLockFreeCounter, SUN_CLS,
1470 "jvmDefineClassNoLockCalls");
1471
1472 NEWPERFEVENTCOUNTER(_sync_JNIDefineClassLockFreeCounter, SUN_CLS,
1473 "jniDefineClassNoLockCalls");
1474
1475 NEWPERFEVENTCOUNTER(_unsafe_defineClassCallCounter, SUN_CLS,
1476 "unsafeDefineClassCalls");
1477 }
1478
1479 // lookup java library entry points
1480 load_java_library();
1481 // jimage library entry points are loaded below, in lookup_vm_options
1482 setup_bootstrap_search_path();
1483 }
1484
lookup_vm_resource(JImageFile * jimage,const char * jimage_version,const char * path)1485 char* lookup_vm_resource(JImageFile *jimage, const char *jimage_version, const char *path) {
1486 jlong size;
1487 JImageLocationRef location = (*JImageFindResource)(jimage, "java.base", jimage_version, path, &size);
1488 if (location == 0)
1489 return NULL;
1490 char *val = NEW_C_HEAP_ARRAY(char, size+1, mtClass);
1491 (*JImageGetResource)(jimage, location, val, size);
1492 val[size] = '\0';
1493 return val;
1494 }
1495
1496 // Lookup VM options embedded in the modules jimage file
lookup_vm_options()1497 char* ClassLoader::lookup_vm_options() {
1498 jint error;
1499 char modules_path[JVM_MAXPATHLEN];
1500 const char* fileSep = os::file_separator();
1501
1502 // Initialize jimage library entry points
1503 load_jimage_library();
1504
1505 jio_snprintf(modules_path, JVM_MAXPATHLEN, "%s%slib%smodules", Arguments::get_java_home(), fileSep, fileSep);
1506 JImageFile* jimage =(*JImageOpen)(modules_path, &error);
1507 if (jimage == NULL) {
1508 return NULL;
1509 }
1510
1511 const char *jimage_version = get_jimage_version_string();
1512 char *options = lookup_vm_resource(jimage, jimage_version, "jdk/internal/vm/options");
1513
1514 (*JImageClose)(jimage);
1515 return options;
1516 }
1517
1518 #if INCLUDE_CDS
initialize_shared_path()1519 void ClassLoader::initialize_shared_path() {
1520 if (Arguments::is_dumping_archive()) {
1521 ClassLoaderExt::setup_search_paths();
1522 }
1523 }
1524
initialize_module_path(TRAPS)1525 void ClassLoader::initialize_module_path(TRAPS) {
1526 if (Arguments::is_dumping_archive()) {
1527 ClassLoaderExt::setup_module_paths(THREAD);
1528 FileMapInfo::allocate_shared_path_table();
1529 }
1530 }
1531
1532 // Helper function used by CDS code to get the number of module path
1533 // entries during shared classpath setup time.
num_module_path_entries()1534 int ClassLoader::num_module_path_entries() {
1535 Arguments::assert_is_dumping_archive();
1536 int num_entries = 0;
1537 ClassPathEntry* e= ClassLoader::_module_path_entries;
1538 while (e != NULL) {
1539 num_entries ++;
1540 e = e->next();
1541 }
1542 return num_entries;
1543 }
1544 #endif
1545
classloader_time_ms()1546 jlong ClassLoader::classloader_time_ms() {
1547 return UsePerfData ?
1548 Management::ticks_to_ms(_perf_accumulated_time->get_value()) : -1;
1549 }
1550
class_init_count()1551 jlong ClassLoader::class_init_count() {
1552 return UsePerfData ? _perf_classes_inited->get_value() : -1;
1553 }
1554
class_init_time_ms()1555 jlong ClassLoader::class_init_time_ms() {
1556 return UsePerfData ?
1557 Management::ticks_to_ms(_perf_class_init_time->get_value()) : -1;
1558 }
1559
class_verify_time_ms()1560 jlong ClassLoader::class_verify_time_ms() {
1561 return UsePerfData ?
1562 Management::ticks_to_ms(_perf_class_verify_time->get_value()) : -1;
1563 }
1564
class_link_count()1565 jlong ClassLoader::class_link_count() {
1566 return UsePerfData ? _perf_classes_linked->get_value() : -1;
1567 }
1568
class_link_time_ms()1569 jlong ClassLoader::class_link_time_ms() {
1570 return UsePerfData ?
1571 Management::ticks_to_ms(_perf_class_link_time->get_value()) : -1;
1572 }
1573
compute_Object_vtable()1574 int ClassLoader::compute_Object_vtable() {
1575 // hardwired for JDK1.2 -- would need to duplicate class file parsing
1576 // code to determine actual value from file
1577 // Would be value '11' if finals were in vtable
1578 int JDK_1_2_Object_vtable_size = 5;
1579 return JDK_1_2_Object_vtable_size * vtableEntry::size();
1580 }
1581
1582
classLoader_init1()1583 void classLoader_init1() {
1584 ClassLoader::initialize();
1585 }
1586
1587 // Complete the ClassPathEntry setup for the boot loader
classLoader_init2(TRAPS)1588 void ClassLoader::classLoader_init2(TRAPS) {
1589 // Setup the list of module/path pairs for --patch-module processing
1590 // This must be done after the SymbolTable is created in order
1591 // to use fast_compare on module names instead of a string compare.
1592 if (Arguments::get_patch_mod_prefix() != NULL) {
1593 setup_patch_mod_entries();
1594 }
1595
1596 // Create the ModuleEntry for java.base (must occur after setup_patch_mod_entries
1597 // to successfully determine if java.base has been patched)
1598 create_javabase();
1599
1600 // Setup the initial java.base/path pair for the exploded build entries.
1601 // As more modules are defined during module system initialization, more
1602 // entries will be added to the exploded build array.
1603 if (!has_jrt_entry()) {
1604 assert(!DumpSharedSpaces, "DumpSharedSpaces not supported with exploded module builds");
1605 assert(!DynamicDumpSharedSpaces, "DynamicDumpSharedSpaces not supported with exploded module builds");
1606 assert(!UseSharedSpaces, "UsedSharedSpaces not supported with exploded module builds");
1607 // Set up the boot loader's _exploded_entries list. Note that this gets
1608 // done before loading any classes, by the same thread that will
1609 // subsequently do the first class load. So, no lock is needed for this.
1610 assert(_exploded_entries == NULL, "Should only get initialized once");
1611 _exploded_entries = new (ResourceObj::C_HEAP, mtModule)
1612 GrowableArray<ModuleClassPathList*>(EXPLODED_ENTRY_SIZE, true);
1613 add_to_exploded_build_list(vmSymbols::java_base(), CHECK);
1614 }
1615 }
1616
get_canonical_path(const char * orig,char * out,int len)1617 bool ClassLoader::get_canonical_path(const char* orig, char* out, int len) {
1618 assert(orig != NULL && out != NULL && len > 0, "bad arguments");
1619 JavaThread* THREAD = JavaThread::current();
1620 ResourceMark rm(THREAD);
1621
1622 // os::native_path writes into orig_copy
1623 char* orig_copy = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, strlen(orig)+1);
1624 strcpy(orig_copy, orig);
1625 if ((CanonicalizeEntry)(os::native_path(orig_copy), out, len) < 0) {
1626 return false;
1627 }
1628 return true;
1629 }
1630
create_javabase()1631 void ClassLoader::create_javabase() {
1632 Thread* THREAD = Thread::current();
1633
1634 // Create java.base's module entry for the boot
1635 // class loader prior to loading j.l.Ojbect.
1636 ClassLoaderData* null_cld = ClassLoaderData::the_null_class_loader_data();
1637
1638 // Get module entry table
1639 ModuleEntryTable* null_cld_modules = null_cld->modules();
1640 if (null_cld_modules == NULL) {
1641 vm_exit_during_initialization("No ModuleEntryTable for the boot class loader");
1642 }
1643
1644 {
1645 MutexLocker ml(THREAD, Module_lock);
1646 ModuleEntry* jb_module = null_cld_modules->locked_create_entry(Handle(),
1647 false, vmSymbols::java_base(), NULL, NULL, null_cld);
1648 if (jb_module == NULL) {
1649 vm_exit_during_initialization("Unable to create ModuleEntry for " JAVA_BASE_NAME);
1650 }
1651 ModuleEntryTable::set_javabase_moduleEntry(jb_module);
1652 }
1653 }
1654
1655 // Please keep following two functions at end of this file. With them placed at top or in middle of the file,
1656 // they could get inlined by agressive compiler, an unknown trick, see bug 6966589.
initialize()1657 void PerfClassTraceTime::initialize() {
1658 if (!UsePerfData) return;
1659
1660 if (_eventp != NULL) {
1661 // increment the event counter
1662 _eventp->inc();
1663 }
1664
1665 // stop the current active thread-local timer to measure inclusive time
1666 _prev_active_event = -1;
1667 for (int i=0; i < EVENT_TYPE_COUNT; i++) {
1668 if (_timers[i].is_active()) {
1669 assert(_prev_active_event == -1, "should have only one active timer");
1670 _prev_active_event = i;
1671 _timers[i].stop();
1672 }
1673 }
1674
1675 if (_recursion_counters == NULL || (_recursion_counters[_event_type])++ == 0) {
1676 // start the inclusive timer if not recursively called
1677 _t.start();
1678 }
1679
1680 // start thread-local timer of the given event type
1681 if (!_timers[_event_type].is_active()) {
1682 _timers[_event_type].start();
1683 }
1684 }
1685
~PerfClassTraceTime()1686 PerfClassTraceTime::~PerfClassTraceTime() {
1687 if (!UsePerfData) return;
1688
1689 // stop the thread-local timer as the event completes
1690 // and resume the thread-local timer of the event next on the stack
1691 _timers[_event_type].stop();
1692 jlong selftime = _timers[_event_type].ticks();
1693
1694 if (_prev_active_event >= 0) {
1695 _timers[_prev_active_event].start();
1696 }
1697
1698 if (_recursion_counters != NULL && --(_recursion_counters[_event_type]) > 0) return;
1699
1700 // increment the counters only on the leaf call
1701 _t.stop();
1702 _timep->inc(_t.ticks());
1703 if (_selftimep != NULL) {
1704 _selftimep->inc(selftime);
1705 }
1706 // add all class loading related event selftime to the accumulated time counter
1707 ClassLoader::perf_accumulated_time()->inc(selftime);
1708
1709 // reset the timer
1710 _timers[_event_type].reset();
1711 }
1712