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

Reply via email to