Reviewer and committer request for 7198496

Peter Levart peter.levart at gmail.com
Thu Oct 4 14:11:15 UTC 2012


On 10/04/2012 03:37 PM, David Holmes wrote:
> On 4/10/2012 9:56 PM, Paul Sandoz wrote:
>>
>> On Oct 4, 2012, at 12:37 PM, David Holmes<david.holmes at oracle.com>  
>> wrote:
>>
>>> Paul,
>>>
>>> On 4/10/2012 7:53 PM, Paul Sandoz wrote:
>>>> On Oct 4, 2012, at 11:34 AM, David 
>>>> Holmes<david.holmes at oracle.com>   wrote:
>>>>>>
>>>>>>> These parts of the javadoc for get/setContextClassLoader are 
>>>>>>> simply wrong.
>>>>>>>
>>>>>>
>>>>>> Wrong or not because of such JavaDoc developers have been coding 
>>>>>> using TCCL with certain expectations of "null" different to that 
>>>>>> of just meaning the bootstrap CL.
>>>>>>
>>>>>> How would you propose to fix it?
>>>>>
>>>>> I don't see anything that actually needs fixing (apart from the 
>>>>> javadoc). Anyone using getCCL has to expect null as a possibility 
>>>>> and they are then free to proceed however they like. The obvious 
>>>>> ways to proceed are as I outlined earlier:
>>>>> - use current classloader
>>>>> - use system loader
>>>>> - use bootstrap loader
>>>>>
>>>>
>>>> So you are proposing to widen the scope? since i interpret the 
>>>> current JavaDoc to correspond to only the latter two options.
>>>
>>> I think you are missing the point. If getCCL returns null it returns 
>>> null - end of story.
>>
>>> What the caller of getCCL does after that is their business, it has 
>>> nothing to do with the spec for getCCL.
>>
>> I think we may be misunderstanding and/or talking over each other. 
>> IIUC you are saying what behaviour you would like and i am saying how 
>> i interpret the current behaviour.
>>
>> I interpret the current JavaDoc as normatively stating what the 
>> caller of getCCL *must* do if null a value is returned.
>
> And that is the problem. A spec for a method can not normatively say 
> what the caller of the method must do with the result.
>
>> A little tweak to the doc might help:
>>
>> From:
>>
>> "@return  the context ClassLoader for this Thread, or {@code null} 
>> indicating the system class loader (or, failing that, the bootstrap 
>> class loader)"
>>
>> To:
>>
>> "@return  the context ClassLoader for this Thread, or {@code null} 
>> indicating the caller shall use the system class loader (or, failing 
>> that, the bootstrap class loader) in place of what would otherwise be 
>> the non-null context ClassLoader."
>>
>> Because TCCL has the annoying property of decoupling behaviour (or 
>> "action at a distance") i think i can see why it was documented in 
>> such a way.
>>
>>
>> So from my perspective you are proposing a change in the specified 
>> behaviour, perhaps to something like:
>
> No I'm not because you can not specify how your caller must behave.
>
>> @return  the context ClassLoader for this Thread, or {@code null} 
>> indicating the context ClassLoader is undefined. It is recommended 
>> that ...
>>
>> Which might be fine, from a backwards compatibility perspective, i am 
>> not sure, but i have been on the receiving end of some very tricky 
>> bugs due to TCCL, hence a conservative position.
>>
>>
>> <snip>
>>>   loader = (cl == null) ? ClassLoader.getSystemClassLoader() : cl;
>>>
>>> which has the same semantic effect, but leaves some "dead" code 
>>> internally as now loader can not be null.
>>>
>>
>> It can if the system CL is null.
>
> The system CL can never be null.
>
> David
> -----

Then there is some dead code in ClassLoader.getSystemClassLoader() method:

     public static ClassLoader getSystemClassLoader() {
         initSystemClassLoader();
         if (scl == null) {
             return null;
         }

And also the javadoc for the method is wrong since it is implying that 
the method may return null...

Or it might be that API is designed to allow null as a return value but 
the OpenJDK implementation never returns one.

If the later is true and ServiceLoader is to be re-used in other Java 
platform implementations, then it must be coded by the API contract and 
not by the implementation details and so should check for null...

Regards, Peter

>
>> Paul.




More information about the core-libs-dev mailing list