--- old/src/hotspot/share/classfile/systemDictionary.cpp 2017-10-09 17:13:07.189802763 -0700 +++ new/src/hotspot/share/classfile/systemDictionary.cpp 2017-10-09 17:13:06.842770170 -0700 @@ -104,6 +104,7 @@ InstanceKlass* SystemDictionary::_box_klasses[T_VOID+1] = { NULL /*, NULL...*/ }; oop SystemDictionary::_java_system_loader = NULL; +oop SystemDictionary::_java_platform_loader = NULL; bool SystemDictionary::_has_loadClassInternal = false; bool SystemDictionary::_has_checkPackageAccess = false; @@ -117,27 +118,38 @@ // ---------------------------------------------------------------------------- -// Java-level SystemLoader +// Java-level SystemLoader and PlatformLoader oop SystemDictionary::java_system_loader() { return _java_system_loader; } -void SystemDictionary::compute_java_system_loader(TRAPS) { - Klass* system_klass = WK_KLASS(ClassLoader_klass); +oop SystemDictionary::java_platform_loader() { + return _java_platform_loader; +} + +void SystemDictionary::compute_java_loaders(TRAPS) { JavaValue result(T_OBJECT); + InstanceKlass* class_loader_klass = SystemDictionary::ClassLoader_klass(); JavaCalls::call_static(&result, - WK_KLASS(ClassLoader_klass), + class_loader_klass, vmSymbols::getSystemClassLoader_name(), vmSymbols::void_classloader_signature(), CHECK); _java_system_loader = (oop)result.get_jobject(); + JavaCalls::call_static(&result, + class_loader_klass, + vmSymbols::getPlatformClassLoader_name(), + vmSymbols::void_classloader_signature(), + CHECK); + + _java_platform_loader = (oop)result.get_jobject(); + CDS_ONLY(SystemDictionaryShared::initialize(CHECK);) } - ClassLoaderData* SystemDictionary::register_loader(Handle class_loader, TRAPS) { if (class_loader() == NULL) return ClassLoaderData::the_null_class_loader_data(); return ClassLoaderDataGraph::find_or_create(class_loader, THREAD); @@ -169,7 +181,7 @@ return false; } return (class_loader->klass() == SystemDictionary::jdk_internal_loader_ClassLoaders_AppClassLoader_klass() || - class_loader == _java_system_loader); + class_loader == _java_system_loader); } // Returns true if the passed class loader is the platform class loader. @@ -1940,6 +1952,7 @@ void SystemDictionary::roots_oops_do(OopClosure* strong, OopClosure* weak) { strong->do_oop(&_java_system_loader); + strong->do_oop(&_java_platform_loader); strong->do_oop(&_system_loader_lock_obj); CDS_ONLY(SystemDictionaryShared::roots_oops_do(strong);) @@ -1964,6 +1977,7 @@ void SystemDictionary::oops_do(OopClosure* f) { f->do_oop(&_java_system_loader); + f->do_oop(&_java_platform_loader); f->do_oop(&_system_loader_lock_obj); CDS_ONLY(SystemDictionaryShared::oops_do(f);) --- old/src/hotspot/share/classfile/systemDictionary.hpp 2017-10-09 17:13:08.012880067 -0700 +++ new/src/hotspot/share/classfile/systemDictionary.hpp 2017-10-09 17:13:07.648845877 -0700 @@ -484,11 +484,14 @@ static bool Object_klass_loaded() { return WK_KLASS(Object_klass) != NULL; } static bool ClassLoader_klass_loaded() { return WK_KLASS(ClassLoader_klass) != NULL; } - // Returns default system loader + // Returns java system loader static oop java_system_loader(); - // Compute the default system loader - static void compute_java_system_loader(TRAPS); + // Returns java platform loader + static oop java_platform_loader(); + + // Compute the java system and platform loaders + static void compute_java_loaders(TRAPS); // Register a new class loader static ClassLoaderData* register_loader(Handle class_loader, TRAPS); @@ -700,6 +703,7 @@ static InstanceKlass* _box_klasses[T_VOID+1]; static oop _java_system_loader; + static oop _java_platform_loader; static bool _has_loadClassInternal; static bool _has_checkPackageAccess; --- old/src/hotspot/share/classfile/vmSymbols.hpp 2017-10-09 17:13:09.061978598 -0700 +++ new/src/hotspot/share/classfile/vmSymbols.hpp 2017-10-09 17:13:08.654940369 -0700 @@ -371,6 +371,7 @@ template(deadChild_name, "deadChild") \ template(getFromClass_name, "getFromClass") \ template(dispatch_name, "dispatch") \ + template(getPlatformClassLoader_name, "getPlatformClassLoader") \ template(getSystemClassLoader_name, "getSystemClassLoader") \ template(fillInStackTrace_name, "fillInStackTrace") \ template(getCause_name, "getCause") \ --- old/src/hotspot/share/runtime/thread.cpp 2017-10-09 17:13:10.120077974 -0700 +++ new/src/hotspot/share/runtime/thread.cpp 2017-10-09 17:13:09.760044160 -0700 @@ -3748,8 +3748,8 @@ // Final system initialization including security manager and system class loader call_initPhase3(CHECK_JNI_ERR); - // cache the system class loader - SystemDictionary::compute_java_system_loader(CHECK_(JNI_ERR)); + // cache the system and platform class loaders + SystemDictionary::compute_java_loaders(CHECK_JNI_ERR); #if INCLUDE_JVMCI if (EnableJVMCI) {