RFR: 8142334: Improve lazy initialization of java.lang.invoke
Peter Levart
peter.levart at gmail.com
Thu Nov 12 18:53:53 UTC 2015
On 11/12/2015 07:50 PM, Claes Redestad wrote:
> Paul,
>
> On 2015-11-12 19:34, Claes Redestad wrote:
>>>
>>> Claes, was it intentional that you call function.resolve() after the
>>> array store? You might need to reverse that and place a
>>> Unsafe.storeFence between them if it is required that the published
>>> and visible function be resolved.
>>
>> This however was unintentional, and I think you're right that this
>> would ensure visibility:
>>
>> function.resolve();
>> UNSAFE.storeFence();
>> FUNCTIONS[idx] = function;
>>
>> http://cr.openjdk.java.net/~redestad/8142334/webrev.04/
>>
>
> turns out the original order might've been necessary at least in
> DirectMethodHandle.java to break a circular dependency:
>
> at
> java.lang.invoke.DirectMethodHandle.setCachedFunction(java.base at 9.0/DirectMethodHandle.java:659)
> at
> java.lang.invoke.DirectMethodHandle.getConstantFunction(java.base at 9.0/DirectMethodHandle.java:650)
> at
> java.lang.invoke.DirectMethodHandle.makePreparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:232)
> at
> java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:188)
> at
> java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:177)
> at
> java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:84)
> at
> java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:104)
> at
> java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:109)
> at
> java.lang.invoke.LambdaForm$NamedFunction.resolve(java.base at 9.0/LambdaForm.java:1078)
> at
> java.lang.invoke.DirectMethodHandle.setCachedFunction(java.base at 9.0/DirectMethodHandle.java:659)
> at
> java.lang.invoke.DirectMethodHandle.getConstantFunction(java.base at 9.0/DirectMethodHandle.java:650)
> at
> java.lang.invoke.DirectMethodHandle.makePreparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:232)
> at
> java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:188)
> at
> java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base at 9.0/DirectMethodHandle.java:177)
> at
> java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:84)
> at
> java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:104)
> at
> java.lang.invoke.DirectMethodHandle.make(java.base at 9.0/DirectMethodHandle.java:109)
> at
> java.lang.invoke.LambdaForm$NamedFunction.resolve(java.base at 9.0/LambdaForm.java:1078)
>
> Do you think this would work correctly w.r.t visibility:
>
> FUNCTIONS[idx] = function;
> function.resolve();
> UNSAFE.storeFence();
This does not do anything useful.
What happens if you simply omit function.resolve() call. If lazy
resolving works and tests pass, then perhaps it's all ok.
Peter
>
> ?
>
> /Claes
More information about the core-libs-dev
mailing list