On Fri, 19 May 2023 03:08:40 GMT, David Holmes <dhol...@openjdk.org> wrote:

>> Paul Hohensee has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   8304074: Need acquire/release in incr_exited_allocated_bytes
>
> src/hotspot/share/services/threadService.hpp line 117:
> 
>> 115:     // store to _exited_allocated_bytes above this one.
>> 116:     jlong old = Atomic::load_acquire(&_exited_allocated_bytes);
>> 117:     Atomic::release_store(&_exited_allocated_bytes, old + size);
> 
> First yes Atomic::load is not needed here due to the lock, it is needed in 
> the accessor above - sorry that wasn't clear. The Atomic store is needed of 
> course.
> 
> But the load_acquire is definitely not needed as there is an implicit acquire 
> when the lock is acquired, so any load of the field here must see the last 
> value written under the lock. The release_store is also not needed because a 
> release is for ensuring visibility of previous stores of which there are 
> none, and has no affect on the visibility of the store done by the 
> `release_store`.
> 
> So lets imagine a really weakly-ordered piece of hardware where all of the 
> writing threads are completely properly synchronized by the use of the lock 
> (else the hw is broken), but a lock-free reader can potentially see any of 
> those writes out-of-order.  I think the only way to guarantee seeing the most 
> recent write would be to issue a full fence() before the load. But I would be 
> very surprised if any of our hardware actually operates in such a fashion.

Thanks for the explanation. I reverted the acquire/release and the atomic load 
in incr_exited_allocated_bytes and added an atomic load in 
exited_allocated_bytes.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/13814#discussion_r1198986781

Reply via email to