Peter, Aleksey,

On 8/13/19 2:17 AM, Peter Levart wrote:
What are you trying to achieve with @Stable annotation?


I chose the path of using it for at least documentation purpose that it is initialized once after <init> :)  This field is not final as it's modified by the VM but it's a stable variable that can benefit from JIT optimization while it's unlikely a hot path with the current usage.

If you were hoping for eventual optimization by JIT (i.e. constant folding) then this would only be effective if JIT could prove that the reference to the StackFrameInfo instance can also be constant folded. This is very unlikely considering the use cases of StackFrameInfo objects (results returned by StackWalker API). There are currently no other optimizations that I know of that would pertain to @Stable annotation.

If you were hoping to achieve some kind of "safer" publication of StackFrameInfo instances (like for example when the fields are final and initialized in the constructor) then @Stable is not a replacement for final. Even if you declared bci as final, its effective value is assigned in the VM after constructor is finished. So the JMM rules for final fields can not apply here. So it is my belief that neither placing @Stable nor final on the bci has any desirable effect. I would just leave it as plain instance field.

There is no existing way to annotate a stable variable besides comments.  It's fair to wait until we have data to show performance benefit to add @Stable.   None of the choices (int, final int, @Stable int) is ideal.   I'll drop @Stable in webrev.04 and move on if that's okay with you.

I do like the zero default value of it and corresponding +/-1 offset computations in the getter and initialization code. If there is a data race when publishing StackFrameInfo objects unsafely to other threads, let there be only two values that are observable instead of three. BTW the unsafe publication applies not only to bci value but to the whole instance referenced by the 'memberName' field. The field is final and initialized in the constructor, but the MemberName instance is modified afterwards...


True.

So let's not pretend publishing StackFrameInfo via data race is safe (like for example String objects). And I think it is not critical to be safe - no security decisions are being made on the StackFrameInfo objects' content, right?


Right.

Mandy
Regards, Peter


Reply via email to