RFR: 8343793: Test java/foreign/TestMemorySession.java is timing out

Quan Anh Mai qamai at openjdk.org
Fri Nov 8 12:01:11 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.

Please take a look, thanks a lot.

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

Commit messages:
 - use < instead of !=

Changes: https://git.openjdk.org/jdk/pull/21976/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=21976&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8343793
  Stats: 2 lines in 1 file changed: 0 ins; 0 del; 2 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