--- a/src/hotspot/share/classfile/classLoader.cpp Thu Oct 17 20:27:44 2019 +0100
+++ b/src/hotspot/share/classfile/classLoader.cpp Thu Oct 17 20:53:35 2019 +0100
@@ -57,7 +57,6 @@
#include "oops/symbol.hpp"
#include "prims/jvm_misc.hpp"
#include "runtime/arguments.hpp"
-#include "runtime/compilationPolicy.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/init.hpp"
#include "runtime/interfaceSupport.inline.hpp"
@@ -69,12 +68,10 @@
#include "runtime/vm_version.hpp"
#include "services/management.hpp"
#include "services/threadService.hpp"
+#include "utilities/classpathStream.hpp"
#include "utilities/events.hpp"
#include "utilities/hashtable.inline.hpp"
#include "utilities/macros.hpp"
-#if INCLUDE_CDS
-#include "classfile/sharedPathsMiscInfo.hpp"
-#endif
// Entry points in zip.dll for loading zip/jar file entries
@@ -146,7 +143,6 @@
ClassPathEntry* ClassLoader::_last_app_classpath_entry = NULL;
ClassPathEntry* ClassLoader::_module_path_entries = NULL;
ClassPathEntry* ClassLoader::_last_module_path_entry = NULL;
-SharedPathsMiscInfo* ClassLoader::_shared_paths_misc_info = NULL;
#endif
// helper routines
@@ -249,13 +245,12 @@
return pkgEntryTable->lookup_only(pkg_symbol);
}
-ClassPathDirEntry::ClassPathDirEntry(const char* dir) : ClassPathEntry() {
- char* copy = NEW_C_HEAP_ARRAY(char, strlen(dir)+1, mtClass);
- strcpy(copy, dir);
- _dir = copy;
+const char* ClassPathEntry::copy_path(const char* path) {
+ char* copy = NEW_C_HEAP_ARRAY(char, strlen(path)+1, mtClass);
+ strcpy(copy, path);
+ return copy;
}
-
ClassFileStream* ClassPathDirEntry::open_stream(const char* name, TRAPS) {
// construct full path name
assert((_dir != NULL) && (name != NULL), "sanity");
@@ -292,11 +287,11 @@
return NULL;
}
-ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name, bool is_boot_append) : ClassPathEntry() {
+ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name,
+ bool is_boot_append, bool from_class_path_attr) : ClassPathEntry() {
_zip = zip;
- char *copy = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1, mtClass);
- strcpy(copy, zip_name);
- _zip_name = copy;
+ _zip_name = copy_path(zip_name);
+ _from_class_path_attr = from_class_path_attr;
}
ClassPathZipEntry::~ClassPathZipEntry() {
@@ -380,18 +375,15 @@
assert(_singleton == NULL, "VM supports only one jimage");
DEBUG_ONLY(_singleton = this);
size_t len = strlen(name) + 1;
- _name = NEW_C_HEAP_ARRAY(const char, len, mtClass);
- strncpy((char *)_name, name, len);
+ _name = copy_path(name);
}
ClassPathImageEntry::~ClassPathImageEntry() {
assert(_singleton == this, "must be");
DEBUG_ONLY(_singleton = NULL);
- if (_name != NULL) {
- FREE_C_HEAP_ARRAY(const char, _name);
- _name = NULL;
- }
+ FREE_C_HEAP_ARRAY(const char, _name);
+
if (_jimage != NULL) {
(*JImageClose)(_jimage);
_jimage = NULL;
@@ -469,7 +461,7 @@
#if INCLUDE_CDS
void ClassLoader::exit_with_path_failure(const char* error, const char* message) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "only called at dump time");
+ Arguments::assert_is_dumping_archive();
tty->print_cr("Hint: enable -Xlog:class+path=info to diagnose the failure");
vm_exit_during_initialization(error, message);
}
@@ -534,61 +526,26 @@
} else {
trace_class_path("bootstrap loader class path=", sys_class_path);
}
-#if INCLUDE_CDS
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
- _shared_paths_misc_info->add_boot_classpath(sys_class_path);
- }
-#endif
setup_boot_search_path(sys_class_path);
}
#if INCLUDE_CDS
-int ClassLoader::get_shared_paths_misc_info_size() {
- return _shared_paths_misc_info->get_used_bytes();
-}
-
-void* ClassLoader::get_shared_paths_misc_info() {
- return _shared_paths_misc_info->buffer();
-}
-
-bool ClassLoader::check_shared_paths_misc_info(void *buf, int size, bool is_static) {
- SharedPathsMiscInfo* checker = new SharedPathsMiscInfo((char*)buf, size);
- bool result = checker->check(is_static);
- delete checker;
- return result;
-}
-
void ClassLoader::setup_app_search_path(const char *class_path) {
-
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "Sanity");
+ Arguments::assert_is_dumping_archive();
- Thread* THREAD = Thread::current();
- int len = (int)strlen(class_path);
- int end = 0;
+ ResourceMark rm;
+ ClasspathStream cp_stream(class_path);
- // Iterate over class path entries
- for (int start = 0; start < len; start = end) {
- while (class_path[end] && class_path[end] != os::path_separator()[0]) {
- end++;
- }
- EXCEPTION_MARK;
- ResourceMark rm(THREAD);
- char* path = NEW_RESOURCE_ARRAY(char, end - start + 1);
- strncpy(path, &class_path[start], end - start);
- path[end - start] = '\0';
-
- update_class_path_entry_list(path, false, false);
-
- while (class_path[end] == os::path_separator()[0]) {
- end++;
- }
+ while (cp_stream.has_next()) {
+ const char* path = cp_stream.get_next();
+ update_class_path_entry_list(path, false, false, false);
}
}
void ClassLoader::add_to_module_path_entries(const char* path,
ClassPathEntry* entry) {
assert(entry != NULL, "ClassPathEntry should not be NULL");
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump time only");
+ Arguments::assert_is_dumping_archive();
// The entry does not exist, add to the list
if (_module_path_entries == NULL) {
@@ -602,7 +559,7 @@
// Add a module path to the _module_path_entries list.
void ClassLoader::update_module_path_entry_list(const char *path, TRAPS) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump time only");
+ Arguments::assert_is_dumping_archive();
struct stat st;
if (os::stat(path, &st) != 0) {
tty->print_cr("os::stat error %d (%s). CDS dump aborted (path was \"%s\").",
@@ -612,7 +569,7 @@
// File or directory found
ClassPathEntry* new_entry = NULL;
new_entry = create_class_path_entry(path, &st, true /* throw_exception */,
- false /*is_boot_append */, CHECK);
+ false /*is_boot_append */, false /* from_class_path_attr */, CHECK);
if (new_entry == NULL) {
return;
}
@@ -641,7 +598,6 @@
GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
int num_of_entries = patch_mod_args->length();
-
// Set up the boot loader's _patch_mod_entries list
_patch_mod_entries = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleClassPathList*>(num_of_entries, true);
@@ -652,32 +608,20 @@
ModuleClassPathList* module_cpl = new ModuleClassPathList(module_sym);
char* class_path = (patch_mod_args->at(i))->path_string();
- int len = (int)strlen(class_path);
- int end = 0;
- // Iterate over the module's class path entries
- for (int start = 0; start < len; start = end) {
- while (class_path[end] && class_path[end] != os::path_separator()[0]) {
- end++;
- }
- EXCEPTION_MARK;
- ResourceMark rm(THREAD);
- char* path = NEW_RESOURCE_ARRAY(char, end - start + 1);
- strncpy(path, &class_path[start], end - start);
- path[end - start] = '\0';
+ ResourceMark rm(THREAD);
+ ClasspathStream cp_stream(class_path);
+ while (cp_stream.has_next()) {
+ const char* path = cp_stream.get_next();
struct stat st;
if (os::stat(path, &st) == 0) {
// File or directory found
- ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, CHECK);
+ ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, false, CHECK);
// If the path specification is valid, enter it into this module's list
if (new_entry != NULL) {
module_cpl->add_to_list(new_entry);
}
}
-
- while (class_path[end] == os::path_separator()[0]) {
- end++;
- }
}
// Record the module into the list of --patch-module entries only if
@@ -705,28 +649,21 @@
// Set up the _jrt_entry if present and boot append path
void ClassLoader::setup_boot_search_path(const char *class_path) {
- int len = (int)strlen(class_path);
- int end = 0;
+ EXCEPTION_MARK;
+ ResourceMark rm(THREAD);
+ ClasspathStream cp_stream(class_path);
bool set_base_piece = true;
#if INCLUDE_CDS
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
if (!Arguments::has_jimage()) {
vm_exit_during_initialization("CDS is not supported in exploded JDK build", NULL);
}
}
#endif
- // Iterate over class path entries
- for (int start = 0; start < len; start = end) {
- while (class_path[end] && class_path[end] != os::path_separator()[0]) {
- end++;
- }
- EXCEPTION_MARK;
- ResourceMark rm(THREAD);
- char* path = NEW_RESOURCE_ARRAY(char, end - start + 1);
- strncpy(path, &class_path[start], end - start);
- path[end - start] = '\0';
+ while (cp_stream.has_next()) {
+ const char* path = cp_stream.get_next();
if (set_base_piece) {
// The first time through the bootstrap_search setup, it must be determined
@@ -737,7 +674,7 @@
struct stat st;
if (os::stat(path, &st) == 0) {
// Directory found
- ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, CHECK);
+ ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, false, CHECK);
// Check for a jimage
if (Arguments::has_jimage()) {
@@ -754,11 +691,7 @@
} else {
// Every entry on the system boot class path after the initial base piece,
// which is set by os::set_boot_path(), is considered an appended entry.
- update_class_path_entry_list(path, false, true);
- }
-
- while (class_path[end] == os::path_separator()[0]) {
- end++;
+ update_class_path_entry_list(path, false, true, false);
}
}
}
@@ -782,7 +715,7 @@
struct stat st;
if (os::stat(path, &st) == 0) {
// Directory found
- ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, CHECK);
+ ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, false, CHECK);
// If the path specification is valid, enter it into this module's list.
// There is no need to check for duplicate modules in the exploded entry list,
@@ -802,7 +735,9 @@
ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const struct stat* st,
bool throw_exception,
- bool is_boot_append, TRAPS) {
+ bool is_boot_append,
+ bool from_class_path_attr,
+ TRAPS) {
JavaThread* thread = JavaThread::current();
ClassPathEntry* new_entry = NULL;
if ((st->st_mode & S_IFMT) == S_IFREG) {
@@ -832,7 +767,7 @@
zip = (*ZipOpen)(canonical_path, &error_msg);
}
if (zip != NULL && error_msg == NULL) {
- new_entry = new ClassPathZipEntry(zip, path, is_boot_append);
+ new_entry = new ClassPathZipEntry(zip, path, is_boot_append, from_class_path_attr);
} else {
char *msg;
if (error_msg == NULL) {
@@ -882,7 +817,7 @@
}
if (zip != NULL && error_msg == NULL) {
// create using canonical path
- return new ClassPathZipEntry(zip, canonical_path, is_boot_append);
+ return new ClassPathZipEntry(zip, canonical_path, is_boot_append, false);
}
}
}
@@ -956,13 +891,14 @@
bool ClassLoader::update_class_path_entry_list(const char *path,
bool check_for_duplicates,
bool is_boot_append,
+ bool from_class_path_attr,
bool throw_exception) {
struct stat st;
if (os::stat(path, &st) == 0) {
// File or directory found
ClassPathEntry* new_entry = NULL;
Thread* THREAD = Thread::current();
- new_entry = create_class_path_entry(path, &st, throw_exception, is_boot_append, CHECK_(false));
+ new_entry = create_class_path_entry(path, &st, throw_exception, is_boot_append, from_class_path_attr, CHECK_(false));
if (new_entry == NULL) {
return false;
}
@@ -976,11 +912,6 @@
}
return true;
} else {
-#if INCLUDE_CDS
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
- _shared_paths_misc_info->add_nonexist_path(path);
- }
-#endif
return false;
}
}
@@ -1393,7 +1324,7 @@
THREAD);
if (HAS_PENDING_EXCEPTION) {
if (DumpSharedSpaces) {
- tty->print_cr("Preload Error: Failed to load %s", class_name);
+ log_error(cds)("Preload Error: Failed to load %s", class_name);
}
return NULL;
}
@@ -1428,7 +1359,7 @@
// Record the shared classpath index and loader type for classes loaded
// by the builtin loaders at dump time.
void ClassLoader::record_result(InstanceKlass* ik, const ClassFileStream* stream, TRAPS) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "sanity");
+ Arguments::assert_is_dumping_archive();
assert(stream != NULL, "sanity");
if (ik->is_unsafe_anonymous()) {
@@ -1600,25 +1531,18 @@
load_zip_library();
// lookup jimage library entry points
load_jimage_library();
-#if INCLUDE_CDS
- // initialize search path
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
- _shared_paths_misc_info = new SharedPathsMiscInfo();
- }
-#endif
setup_bootstrap_search_path();
}
#if INCLUDE_CDS
void ClassLoader::initialize_shared_path() {
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
ClassLoaderExt::setup_search_paths();
- _shared_paths_misc_info->write_jint(0); // see comments in SharedPathsMiscInfo::check()
}
}
void ClassLoader::initialize_module_path(TRAPS) {
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
ClassLoaderExt::setup_module_paths(THREAD);
FileMapInfo::allocate_shared_path_table();
}