On Fri, 8 Nov 2024 16:59:48 GMT, Quan Anh Mai <[email protected]> wrote:
>> Hi,
>>
>> This patch fixes the deadlock in `TestMemorySession#testAcquireCloseRace`.
>> The lock-step spin lock is implemented as with `lock` being an
>> `AtomicInteger`:
>>
>> // Keep the 2 threads operating on the same scope
>> int k = lock.getAndAdd(1) + 1;
>> while (k != i * 2) {
>> Thread.onSpinWait();
>> k = lock.get();
>> }
>>
>> Given the initial condition:
>>
>> Thread 1: i = 0
>> Thread 2: i = 0
>> lock: -2
>>
>> The `lock` then undergoes the following operations:
>>
>>
>>
>> Thread 1 Thread 2 lock value
>> getAndAdd(1) -1
>> getAndAdd(1) 0 -> Thread 2 then continues
>> its next iteration, its i value is now 1
>> getAndAdd(1) 1 -> Thread 2 reaches the
>> next iteration before thread 1 has a chance to read the value 0
>> get() 1 -> Thread 1 now cannot
>> proceed because it missed the value 0
>> get() 1 -> Thread 2 now cannot
>> proceed because lock can never reach 2
>>
>>
>> The solution is to not rely on the exact value of the lock but instead
>> whether the lock has passed the expected value.
>>
>> Testing: I have run this test several hundreds times and got no failure
>> while without this patch I encountered a timeout every approximately 30
>> times.
>>
>> Please take a look, thanks a lot.
>
> Quan Anh Mai has updated the pull request incrementally with one additional
> commit since the last revision:
>
> refactor the test
Thanks!
-------------
Marked as reviewed by mcimadamore (Reviewer).
PR Review: https://git.openjdk.org/jdk/pull/21976#pullrequestreview-2425021686