RFR: 8247213: G1: Reduce usage of volatile in favour of Atomic operations
David Holmes
david.holmes at oracle.com
Thu Jun 11 13:34:11 UTC 2020
Hi Leo,
On 11/06/2020 8:47 pm, Leo Korinth wrote:
> On 11/06/2020 04:58, David Holmes wrote:
>> Hi Leo,
>>
>> On 10/06/2020 11:02 pm, Leo Korinth wrote:
>>> Hi, I have created a RFR in the hotspot-gc-dev mailing list that
>>> mostly changes stuff in G1. However I am also doing changes in
>>> atomic.hpp (mostly adding an AtomicValue<> class) so there might be
>>> interest outside gc. If you have interest, please follow that thread.
>>
>> If you are changing atomic.hpp then please cross-post to
>> hotspot-runtime-dev. Or even cross-post here on hotspot-dev as there
>> should be a broad consensus on how to handle this in the VM.
>
> That was what I tried to do by sending the email. I want to have the
> discussion in one place though, so I thought it was better announcing
> the RFR on hotspot-gc-dev on this mailing list than potentially creating
> two review threads by cross-posting.
You can't expect all hotspot engineers to subscribe to hotspot-gc-dev to
have this conversation. Either use a common list, like hotspot-dev (that
we should all be subscribed to) or else cross-post.
Thanks,
David
-----
> Next time I will cross post and tell people to reply on hotspot-gc-dev
> if that is preferable. Is it? I have attached the email below:
>
>
> Hi, could I have a review for this change that adds AtomicValue<> to
> atomic.hpp and uses it in G1?
>
> I am adding an AtomicValue<> to atomic.hpp. This is an opaque type (the
> "value" is private) and that protect against non-atomic operations being
> used by mistake. AtomicValue methods are proxied to the corresponding
> (all-static) Atomic:: methods. All operations are explicitly atomic and
> in a type safe manner with semantics defined in enum atomic_memory_order
> (memory_order_conservative by default).
>
> Instead of using field variables as volatile, I change them to be of
> AtomicValue<> type. No need to verify that += (for example) will result
> in an atomic instruction on all supported compilers.
>
> I have some open questions regarding the exported fields in
> vmStructs_g1.hpp. Today, volatile fields are sometimes "exported" as
> volatile (and sometimes not, and I guess this is by mistake). I choose
> to export them all as non-volatile. From what I can see the volatile
> specific part only casts to void* (only documentation?). Java code is
> unchanged and still access them as the unwrapped values (static assert
> in atomic.hpp guarantees that memory layout is the same for T and
> AtomicValue<T>). I think this is okay, but would like feedback on all this.
>
> The change is presented as a two part change. The first part changes all
> volatile to AtomicValue, the other part removes the AtomicValue part on
> non-field accesses. By doing it two part I will not forget to transform
> some operations by mistake.
>
> Copyright years will be updated when all other changes are approved.
>
> How about pushing this after 15 is branched off and thus have it for 16?
>
> Enhancement:
> https://bugs.openjdk.java.net/browse/JDK-8247213
>
> Webrev:
> http://cr.openjdk.java.net/~lkorinth/8247213/0/part1
> http://cr.openjdk.java.net/~lkorinth/8247213/0/part2
> http://cr.openjdk.java.net/~lkorinth/8247213/0/full
>
> Testing:
> tier1-3
>
> Thanks,
> Leo
>>
>> Thanks,
>> David
>>
>>> Thanks,
>>> Leo
More information about the hotspot-dev
mailing list