--- old/src/share/vm/classfile/classLoader.cpp 2016-12-08 19:05:12.122067455 -0500 +++ new/src/share/vm/classfile/classLoader.cpp 2016-12-08 19:05:10.557978088 -0500 @@ -84,7 +84,6 @@ typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n); typedef jboolean (JNICALL *ZipInflateFully_t)(void *inBuf, jlong inLen, void *outBuf, jlong outLen, char **pmsg); typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len); -typedef void (JNICALL *FreeEntry_t)(jzfile *zip, jzentry *entry); static ZipOpen_t ZipOpen = NULL; static ZipClose_t ZipClose = NULL; @@ -94,7 +93,6 @@ static canonicalize_fn_t CanonicalizeEntry = NULL; static ZipInflateFully_t ZipInflateFully = NULL; static Crc32_t Crc32 = NULL; -static FreeEntry_t FreeEntry = NULL; // Entry points for jimage.dll for loading jimage file entries @@ -150,7 +148,6 @@ GrowableArray* ClassLoader::_boot_modules_array = NULL; GrowableArray* ClassLoader::_platform_modules_array = NULL; SharedPathsMiscInfo* ClassLoader::_shared_paths_misc_info = NULL; -int ClassLoader::_num_patch_mod_prefixes = 0; #endif // helper routines @@ -320,20 +317,6 @@ FREE_C_HEAP_ARRAY(char, _zip_name); } -bool ClassPathZipEntry::stream_exists(const char* name) { - // enable call to C land - JavaThread* thread = JavaThread::current(); - ThreadToNativeFromVM ttn(thread); - // check whether zip archive contains name - jint name_len, filesize; - jzentry* entry = (*FindEntry)(_zip, name, &filesize, &name_len); - if (entry != NULL) { - (*FreeEntry)(_zip, entry); - return true; - } - return false; -} - u1* ClassPathZipEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) { // enable call to C land JavaThread* thread = JavaThread::current(); @@ -1090,7 +1073,6 @@ GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry")); ZipInflateFully = CAST_TO_FN_PTR(ZipInflateFully_t, os::dll_lookup(handle, "ZIP_InflateFully")); Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32")); - FreeEntry = CAST_TO_FN_PTR(FreeEntry_t, os::dll_lookup(handle, "ZIP_FreeEntry")); // ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL || @@ -1418,57 +1400,6 @@ return NULL; } -#if INCLUDE_CDS -// The following function is only used during CDS dump time. -// It checks if a class can be found in the jar entries of the _patch_mod_entries. -// It does not support non-jar entries. -bool ClassLoader::is_in_patch_module(const char* const file_name) { - assert(DumpSharedSpaces, "dump time only"); - if (_patch_mod_entries == NULL) { - return false; - } - - int num_of_entries = _patch_mod_entries->length(); - char* class_module_name = NULL; - ResourceMark rm; - const char *pkg_name = package_from_name(file_name); - // Using the jimage to obtain the class' module name. - // The ModuleEntryTable cannot be used at this point during dump time - // because the module system hasn't been initialized yet. - if (pkg_name != NULL) { - JImageFile *jimage = _jrt_entry->jimage(); - class_module_name = (char*)(*JImagePackageToModule)(jimage, pkg_name); - } - - if (class_module_name == NULL) { - return false; - } - - // Loop through all the patch module entries looking for module - for (int i = 0; i < num_of_entries; i++) { - ModuleClassPathList* module_cpl = _patch_mod_entries->at(i); - Symbol* module_cpl_name = module_cpl->module_name(); - - if (strcmp(module_cpl_name->as_C_string(), class_module_name) == 0) { - // Class' module has been located, attempt to locate - // the class from the module's ClassPathEntry list. - ClassPathEntry* e = module_cpl->module_first_entry(); - while (e != NULL) { - if (e->is_jar_file()) { - if (e->stream_exists(file_name)) { - return true; - } else { - e = e->next(); - } - } - } - } - } - - return false; -} -#endif // INCLUDE_CDS - instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) { assert(name != NULL, "invariant"); assert(THREAD->is_Java_thread(), "must be a JavaThread"); @@ -1494,8 +1425,6 @@ // If DumpSharedSpaces is true boot loader visibility boundaries are set to: // - [jimage] + [_first_append_entry to _last_append_entry] (all path entries). - // If a class is found in the --patch-module entries, the class will not be included in the - // CDS archive. Also, CDS is not supported if exploded module builds are used. // // If search_append_only is true, boot loader visibility boundaries are // set to be _first_append_entry to the end. This includes: @@ -1519,15 +1448,13 @@ // Note: The --patch-module entries are never searched if the boot loader's // visibility boundary is limited to only searching the append entries. if (_patch_mod_entries != NULL && !search_append_only) { + // At CDS dump time, the --patch-module entries are ignored. That means a + // class is still loaded from the [jimage|exploded build] even if it might + // appear in the _patch_mod_entries. The runtime shared class visibility + // check will determine if a shared class is visible based on the runtime + // environemnt, including the runtime --patch-module setting. if (!DumpSharedSpaces) { stream = search_module_entries(_patch_mod_entries, class_name, file_name, CHECK_NULL); - } else { -#if INCLUDE_CDS - if (is_in_patch_module(file_name)) { - tty->print_cr("Preload Warning: Skip archiving class %s found in --patch-module entry", class_name); - return NULL; - } -#endif } } @@ -1679,57 +1606,8 @@ } #if INCLUDE_CDS -// Capture all the --patch-module entries specified during CDS dump time. -// It also captures the non-existing path(s) and the required file(s) during inspecting -// the entries. -void ClassLoader::setup_patch_mod_path() { - assert(DumpSharedSpaces, "only used with -Xshare:dump"); - ResourceMark rm; - GrowableArray* patch_mod_args = Arguments::get_patch_mod_prefix(); - if (patch_mod_args != NULL) { - int num_of_entries = patch_mod_args->length(); - for (int i = 0; i < num_of_entries; i++) { - const char* module_name = (patch_mod_args->at(i))->module_name(); - const char* module_path = (patch_mod_args->at(i))->path_string(); - int path_len = (int)strlen(module_path); - int name_len = (int)strlen(module_name); - int buf_len = name_len + path_len + 2; // add 2 for the '=' and NULL terminator - int end = 0; - char* buf = NEW_C_HEAP_ARRAY(char, buf_len, mtInternal); - // Iterate over the module's class path entries - for (int start = 0; start < path_len; start = end) { - while (module_path[end] && module_path[end] != os::path_separator()[0]) { - end++; - } - strncpy(buf, &module_path[start], end - start); - buf[end - start] = '\0'; - struct stat st; - if (os::stat(buf, &st) != 0) { - // File not found - _shared_paths_misc_info->add_nonexist_path(buf); - } else { - if ((st.st_mode & S_IFMT) != S_IFREG) { // is not a regular file - vm_exit_during_initialization( - "--patch-module requires a regular file during dumping", buf); - } else { - _shared_paths_misc_info->add_required_file(buf); - } - } - while (module_path[end] == os::path_separator()[0]) { - end++; - } - }; - jio_snprintf(buf, buf_len, "%s=%s", module_name, module_path); - _shared_paths_misc_info->add_patch_mod_classpath((const char*)buf); - _num_patch_mod_prefixes++; - FREE_C_HEAP_ARRAY(char, buf); - } - } -} - void ClassLoader::initialize_shared_path() { if (DumpSharedSpaces) { - setup_patch_mod_path(); ClassLoaderExt::setup_search_paths(); _shared_paths_misc_info->write_jint(0); // see comments in SharedPathsMiscInfo::check() }