On Fri, 8 Nov 2024 16:59:48 GMT, Quan Anh Mai <qa...@openjdk.org> 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

Reply via email to