RFR(S): 8185694: Replace SystemDictionaryShared::_java_platform_loader with SystemDictionary::is_platform_class_loader()
David Holmes
david.holmes at oracle.com
Thu Oct 5 05:02:33 UTC 2017
Hi Calvin,
On 5/10/2017 2:45 PM, Calvin Cheung wrote:
> On 10/4/17, 4:30 PM, David Holmes wrote:
>> On 5/10/2017 8:22 AM, Calvin Cheung wrote:
>>> On 10/4/17, 2:41 PM, David Holmes wrote:
>>>> Hi Calvin,
>>>>
>>>> On 5/10/2017 3:12 AM, Calvin Cheung wrote:
>>>>> Mandy, David,
>>>>>
>>>>> Thanks for the review.
>>>>>
>>>>> I've made the change based on your suggestion:
>>>>> http://cr.openjdk.java.net/~ccheung/8185694/webrev.01/
>>>>
>>>> share/classfile/systemDictionary.cpp
>>>>
>>>> There's an existing bug that this local is not used:
>>>>
>>>> 132 Klass* system_klass = WK_KLASS(ClassLoader_klass);
>>>>
>>>> (and the variable is poorly named). Now that you need to use
>>>> WK_KLASS(ClassLoader_klass) twice you should instead use the local.
>>> How about changing the local variable name to class_loader_klass and
>>> using it at lines 135 and 143?
>>
>> Yep.
> I've made this change.
> Updated webrev:
> http://cr.openjdk.java.net/~ccheung/8185694/webrev.02/
>
> It also contains the change in threads.cpp - from CHECK_(JNI_ERR) to
> CHECK_JNI_ERR.
>>
>>>>
>>>> ---
>>>>
>>>> As Mandy alludes these:
>>>>
>>>> 177 // Returns true if the passed class loader is the builtin
>>>> application class loader
>>>> 178 // or a custom system class loader. A customer system class
>>>> loader can be
>>>> 179 // specified via -Djava.system.class.loader.
>>>> 180 bool SystemDictionary::is_system_class_loader(oop class_loader) {
>>>> 181 if (class_loader == NULL) {
>>>> 182 return false;
>>>> 183 }
>>>> 184 return (class_loader->klass() ==
>>>> SystemDictionary::jdk_internal_loader_ClassLoaders_AppClassLoader_klass()
>>>> ||
>>>> 185 class_loader == _java_system_loader);
>>>> 186 }
>>>> 187
>>>> 188 // Returns true if the passed class loader is the platform
>>>> class loader.
>>>> 189 bool SystemDictionary::is_platform_class_loader(oop
>>>> class_loader) {
>>>> 190 if (class_loader == NULL) {
>>>> 191 return false;
>>>> 192 }
>>>> 193 return (class_loader->klass() ==
>>>> SystemDictionary::jdk_internal_loader_ClassLoaders_PlatformClassLoader_klass());
>>>>
>>>> 194 }
>>>>
>>>> would seem to be checking the wrong things - they should just be
>>>> checking java_system_loader() and java_platform_loader() shouldn't
>>>> they?
>>> Do you mean lines 184 and 185 could become the following?
>>>
>>> return (class_loader == _java_system_loader);
> After a closer look at the comment, I think lines 184 and 185 are correct.
>
> // Returns true if the passed class loader is the builtin application
> class loader
> // or a custom system class loader.
>
> I'm afraid something may break and would like to leave it alone for now.
It needs to be looked at - at a minimum file a follow up bug. Both
conditions imply the loader IS the system (aka application) class loader.
>>>
>>> and line 193 could become the following?
>>>
>>> return (class_loader == _java_platform_loader);
> I can't change this one either; I tried it and resulting in the
> following build error:
>
> Creating interim jimage
> Error occurred during initialization of boot layer
> java.lang.LayerInstantiationException: Class loader (instance of):
> jdk/internal/loader/ClassLoaders$PlatformClassLoader tried to define
> prohibited package name: java.sql
Something very weird going on there that needs to be resolved before
these changes are pushed IMHO. Sorry but there's obviously more
happening here than meets the eye.
David
> thanks,
> Calvin
>>
>> Yes - exactly.
>>
>>>>
>>>> In the case of is_system_class_loader() it seems odd that it checks
>>>> a specific hard-wired class as well as the defined
>>>> _java_system_loader ??
>>> Not sure. That code has been there for a long time.
>>>
>>> Also, both
>>> SystemDictionary::jdk_internal_loader_ClassLoaders_AppClassLoader_klass()
>>> and
>>> SystemDictionary::jdk_internal_loader_ClassLoaders_PlatformClassLoader_klass()
>>> are being used in the closed source for JavaCalls.
>>
>> Unless you really need to determine that the loader is of an actual
>> type, you should only be querying java_system_loader() and
>> java_platform_loader().
>>
>> Thanks,
>> David
>> -----
>>
>>> thanks,
>>> Calvin
>>>>
>>>> Thanks,
>>>> David
>>>> -----
>>>>
>>>>
>>>>
>>>>> thanks,
>>>>> Calvin
>>>>>
>>>>> On 10/4/17, 8:29 AM, mandy chung wrote:
>>>>>>
>>>>>>
>>>>>> On 10/3/17 11:36 PM, David Holmes wrote:
>>>>>>> Hi Calvin,
>>>>>>>
>>>>>>> On 4/10/2017 7:26 AM, Calvin Cheung wrote:
>>>>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8185694
>>>>>>>>
>>>>>>>> The open code change for this fix involves adding the
>>>>>>>> _java_platform_loader to the SystemDictionary class.
>>>>>>>>
>>>>>>>> webrev: http://cr.openjdk.java.net/~ccheung/8185694/webrev.00/
>>>>>>>
>>>>>>> I think you should be calling getPlatformClassLoader rather than
>>>>>>> poking at the parent field of the system loader. That way you
>>>>>>> don't have to worry about whether or not the system loader has
>>>>>>> been customized by the user.
>>>>>> Agree. ClassLoader::getPlatformClassLoader is the right way to
>>>>>> get the platform class loader.
>>>>>>
>>>>>> Mandy
More information about the hotspot-runtime-dev
mailing list