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