# HG changeset patch # User iklam # Date 1526963232 25200 # Node ID adec398d9051296a01c392f58645846cca5411ec # Parent 95ba3a1dc2b22a4bf0c13ec00eb6c03f9c6a44de 8193332: MetaspaceShared::check_shared_class_loader_type is not used during archive creation Reviewed-by: lfoltan, jiangli diff -r 95ba3a1dc2b2 -r adec398d9051 src/hotspot/share/classfile/classListParser.cpp --- a/src/hotspot/share/classfile/classListParser.cpp Mon May 21 18:44:09 2018 -0700 +++ b/src/hotspot/share/classfile/classListParser.cpp Mon May 21 21:27:12 2018 -0700 @@ -311,6 +311,7 @@ // This tells JVM_FindLoadedClass to not find this class. k->set_shared_classpath_index(UNREGISTERED_INDEX); + k->clear_class_loader_type(); } return k; diff -r 95ba3a1dc2b2 -r adec398d9051 src/hotspot/share/classfile/classLoader.cpp --- a/src/hotspot/share/classfile/classLoader.cpp Mon May 21 18:44:09 2018 -0700 +++ b/src/hotspot/share/classfile/classLoader.cpp Mon May 21 21:27:12 2018 -0700 @@ -1410,16 +1410,12 @@ s2 classpath_index = 0; ClassPathEntry* e = NULL; - // If DumpSharedSpaces is true boot loader visibility boundaries are set to: - // - [jimage] + [_first_append_entry to _last_append_entry] (all path entries). - // // If search_append_only is true, boot loader visibility boundaries are // set to be _first_append_entry to the end. This includes: // [-Xbootclasspath/a]; [jvmti appended entries] // - // If both DumpSharedSpaces and search_append_only are false, boot loader - // visibility boundaries are set to be the --patch-module entries plus the base piece. - // This would include: + // If search_append_only is false, boot loader visibility boundaries are + // set to be the --patch-module entries plus the base piece. This includes: // [--patch-module==()*]; [jimage | exploded module build] // @@ -1455,7 +1451,7 @@ } // Load Attempt #3: [-Xbootclasspath/a]; [jvmti appended entries] - if ((search_append_only || DumpSharedSpaces) && (NULL == stream)) { + if (search_append_only && (NULL == stream)) { // For the boot loader append path search, the starting classpath_index // for the appended piece is always 1 to account for either the // _jrt_entry or the _exploded_entries. diff -r 95ba3a1dc2b2 -r adec398d9051 src/hotspot/share/memory/metaspaceShared.cpp --- a/src/hotspot/share/memory/metaspaceShared.cpp Mon May 21 18:44:09 2018 -0700 +++ b/src/hotspot/share/memory/metaspaceShared.cpp Mon May 21 21:27:12 2018 -0700 @@ -1411,6 +1411,9 @@ // Move classes from platform/system dictionaries into the boot dictionary SystemDictionary::combine_shared_dictionaries(); + // Make sure all classes have a correct loader type. + ClassLoaderData::the_null_class_loader_data()->dictionary()->classes_do(MetaspaceShared::check_shared_class_loader_type); + // Remove all references outside the metadata tty->print("Removing unshareable information ... "); remove_unshareable_in_classes(); @@ -1610,13 +1613,14 @@ } }; -void MetaspaceShared::check_shared_class_loader_type(Klass* k) { - if (k->is_instance_klass()) { - InstanceKlass* ik = InstanceKlass::cast(k); - u2 loader_type = ik->loader_type(); - ResourceMark rm; - guarantee(loader_type != 0, - "Class loader type is not set for this class %s", ik->name()->as_C_string()); +void MetaspaceShared::check_shared_class_loader_type(InstanceKlass* ik) { + ResourceMark rm; + if (ik->shared_classpath_index() == UNREGISTERED_INDEX) { + guarantee(ik->loader_type() == 0, + "Class loader type must not be set for this class %s", ik->name()->as_C_string()); + } else { + guarantee(ik->loader_type() != 0, + "Class loader type must be set for this class %s", ik->name()->as_C_string()); } } diff -r 95ba3a1dc2b2 -r adec398d9051 src/hotspot/share/memory/metaspaceShared.hpp --- a/src/hotspot/share/memory/metaspaceShared.hpp Mon May 21 18:44:09 2018 -0700 +++ b/src/hotspot/share/memory/metaspaceShared.hpp Mon May 21 21:27:12 2018 -0700 @@ -225,7 +225,7 @@ static bool try_link_class(InstanceKlass* ik, TRAPS); static void link_and_cleanup_shared_classes(TRAPS); - static void check_shared_class_loader_type(Klass* obj); + static void check_shared_class_loader_type(InstanceKlass* ik); // Allocate a block of memory from the "mc", "ro", or "rw" regions. static char* misc_code_space_alloc(size_t num_bytes); diff -r 95ba3a1dc2b2 -r adec398d9051 src/hotspot/share/oops/instanceKlass.hpp --- a/src/hotspot/share/oops/instanceKlass.hpp Mon May 21 18:44:09 2018 -0700 +++ b/src/hotspot/share/oops/instanceKlass.hpp Mon May 21 21:27:12 2018 -0700 @@ -326,6 +326,10 @@ return (_misc_flags & _misc_is_shared_app_class) != 0; } + void clear_class_loader_type() { + _misc_flags &= ~loader_type_bits(); + } + void set_class_loader_type(s2 loader_type) { switch (loader_type) { case ClassLoader::BOOT_LOADER: diff -r 95ba3a1dc2b2 -r adec398d9051 test/hotspot/jtreg/runtime/SharedArchiveFile/BootAppendTests.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/BootAppendTests.java Mon May 21 18:44:09 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/BootAppendTests.java Mon May 21 21:27:12 2018 -0700 @@ -115,7 +115,15 @@ "-XX:SharedClassListFile=" + classlist.getPath()); // Make sure all the classes were successfully archived. for (String archiveClass : ARCHIVE_CLASSES) { - out.shouldNotContain("Preload Warning: Cannot find " + archiveClass); + String msg = "Preload Warning: Cannot find " + archiveClass; + if (archiveClass.equals(BOOT_APPEND_MODULE_CLASS)) { + // We shouldn't archive a class in the appended boot class path that + // are the java.desktop module. Such a class cannot be loaded + // at runtime anyway. + out.shouldContain(msg); + } else { + out.shouldNotContain(msg); + } } }