RFR: 8343793: Test java/foreign/TestMemorySession.java is timing out [v2]
Quan Anh Mai
qamai at openjdk.org
Fri Nov 8 16:59:48 UTC 2024
> 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
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/21976/files
- new: https://git.openjdk.org/jdk/pull/21976/files/940b7d04..e77ce9e8
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=21976&range=01
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=21976&range=00-01
Stats: 24 lines in 1 file changed: 10 ins; 6 del; 8 mod
Patch: https://git.openjdk.org/jdk/pull/21976.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/21976/head:pull/21976
PR: https://git.openjdk.org/jdk/pull/21976
More information about the core-libs-dev
mailing list