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@9.0/DirectMethodHandle.java:659)
at
java.lang.invoke.DirectMethodHandle.getConstantFunction(java.base@9.0/DirectMethodHandle.java:650)
at
java.lang.invoke.DirectMethodHandle.makePreparedLambdaForm(java.base@9.0/DirectMethodHandle.java:232)
at
java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base@9.0/DirectMethodHandle.java:188)
at
java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base@9.0/DirectMethodHandle.java:177)
at
java.lang.invoke.DirectMethodHandle.make(java.base@9.0/DirectMethodHandle.java:84)
at
java.lang.invoke.DirectMethodHandle.make(java.base@9.0/DirectMethodHandle.java:104)
at
java.lang.invoke.DirectMethodHandle.make(java.base@9.0/DirectMethodHandle.java:109)
at
java.lang.invoke.LambdaForm$NamedFunction.resolve(java.base@9.0/LambdaForm.java:1078)
at
java.lang.invoke.DirectMethodHandle.setCachedFunction(java.base@9.0/DirectMethodHandle.java:659)
at
java.lang.invoke.DirectMethodHandle.getConstantFunction(java.base@9.0/DirectMethodHandle.java:650)
at
java.lang.invoke.DirectMethodHandle.makePreparedLambdaForm(java.base@9.0/DirectMethodHandle.java:232)
at
java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base@9.0/DirectMethodHandle.java:188)
at
java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base@9.0/DirectMethodHandle.java:177)
at
java.lang.invoke.DirectMethodHandle.make(java.base@9.0/DirectMethodHandle.java:84)
at
java.lang.invoke.DirectMethodHandle.make(java.base@9.0/DirectMethodHandle.java:104)
at
java.lang.invoke.DirectMethodHandle.make(java.base@9.0/DirectMethodHandle.java:109)
at
java.lang.invoke.LambdaForm$NamedFunction.resolve(java.base@9.0/LambdaForm.java:1078)
Do you think this would work correctly w.r.t visibility:
FUNCTIONS[idx] = function;
function.resolve();
UNSAFE.storeFence();
?
/Claes