RFR 8174954: Parameter target type is allowed access after a module read edge or a package export has occurred after failed resolution

David Holmes david.holmes at oracle.com
Sun Oct 22 06:17:26 UTC 2017


Hi Harold,

On 20/10/2017 11:37 PM, harold seigel wrote:
> Hi David,
> 
> MethodAccessReadTwice.java is an indy test.  Lines 120 - 153 test that 
> the same invokedynamic instruction gets the same result.  The 
> invokedynamic instruction gets generated for the string concatenation at 
> line 31 of file .../p5/c5.java:

Okay. It was totally not at all evident from the bug report and the test 
code that the underlying problem was actually related to indy due to the 
string concatenation.

Thanks,
David

> 
>        24 package p5;
>        25
>        26 import java.lang.Module;
>        27 import p2.c2;
>        28
>        29 public class c5 {
>        30     public void method5(p2.c2 param) {
>        31         System.out.println("In c5's method5 with param = " + param);
>        32     }
>        33
>        34     public void methodAddReadEdge(Module m) {
>        35         // Add a read edge from p5/c5's module (first_mod) to second_mod
>        36         c5.class.getModule().addReads(m);
>        37     }
>        38 }
> 
> The indy resolution throws an IAE because package p5's module cannot 
> read package p2's module.
> 
> The second test case, at lines 156 - 161 of MethodAccessReadTwice.java, 
> similarly tests invokedynamic instructions.  In this case, they are 
> generated for the string concatenations at lines 32 and 43 of file 
> .../p7/c7.java.
> 
> This problem does not exist for non-indy instructions because, when 
> their resolutions fail, they update the constant pool.  Indy cannot do 
> this because, unlike other instructions, different indy instructions 
> that use the same constant pool index are allowed to get different 
> results.  Hence, the fix is indy only.
> 
> Thanks, Harold
> 
> On 10/20/2017 1:15 AM, David Holmes wrote:
>> Hi Harold,
>>
>> On 19/10/2017 12:20 AM, harold seigel wrote:
>>> Hi David,
>>>
>>> Thanks for looking at this.
>>>
>>> Please see inline comments.
>>>
>>> Thanks, Harold
>>>
>>>
>>> On 10/17/2017 10:22 PM, David Holmes wrote:
>>>> Hi Harold,
>>>>
>>>> On 17/10/2017 12:20 AM, harold seigel wrote:
>>>>> Hi,
>>>>>
>>>>> Please review this new JDK-10 fix for bug JDK-8174954.  If the 
>>>>> initial resolution attempt fails with a LinkageError exception then 
>>>>> the fix saves the exception in the resolution_errors table and sets 
>>>>> a flag in the constant pool Cache, indicating the failure.  
>>>>> Subsequent attempts to do the same resolution will see that the 
>>>>> flag is set, retrieve the exception from the resolution_errors 
>>>>> table, and throw it, instead of re-trying the resolution.
>>>>
>>>> I'm a little confused. The fix seems all about indy, which seems to 
>>>> be the topic of:
>>>>
>>>>  JDK-8174942 Bootstrap Method Called Multiple Times Despite Initial 
>>>> Resolution Failure
>>>>
>>>> whereas this bug seems to be about a more general problem. Is this 
>>>> fix addressing both issues??
>>> Thanks for noticing this.  This fix addresses both bugs.  The sample 
>>> program for 8174942 is one of the test cases for this fix.  I'll 
>>> close 8174942 as a duplicate.
>>
>> I'm still somewhat confused as it seems that all the substantive 
>> changes here have the word "indy" in them. What part of the change 
>> actually fixes the non-indy issue tested by MethodAccessReadTwice.java?
>>
>> Thanks,
>> David
>>>>
>>>> BTW there's no reason for JDK-8174954 to remain confidential.
>>> Agreed.  I opened the bug.
>>>>
>>>> Thanks,
>>>> David
>>>>
>>>>> The fix also prevents a race condition if two or more threads try 
>>>>> to do the same resolution concurrently. When a thread tries to 
>>>>> record the result of its resolution attempt, it will check to see 
>>>>> if another thread recorded its result first.  If so, then it will 
>>>>> use the result recorded by the other thread.  Otherwise, it will 
>>>>> record and use its result. Access to the resolution result is 
>>>>> protected by the 'resolved_references' lock.
>>>>>
>>>>> Open webrev: http://cr.openjdk.java.net/~hseigel/bug_8174954.1/webrev/
>>>>>
>>>>> JBS Bug: https://bugs.openjdk.java.net/browse/JDK-8174954
>>>>>
>>>>> The fix was tested with the JCK Lang and VM tests, the JTreg 
>>>>> hotspot, java/io, java/lang, java/util, and other tests, the 
>>>>> co-located NSK tests, JPRT, with Mach5 tier2 - tier5 tests, and by 
>>>>> hand to check race condition handling.
>>>>>
>>>>> Thanks, Harold
>>>>>
>>>
> 


More information about the hotspot-runtime-dev mailing list