-
Type:
Bug
-
Resolution: Unresolved
-
Priority:
P3
-
Affects Version/s: 25
-
Component/s: core-libs
-
None
We discovered that on some weaker memory consistency architectures (read aarch64, etc) a read with acquire-fence is necessary in order to correctly observe an element being present in WorkQueue::push().
Unfortunately it is not feasible to add a regression test for this, as it very rarely manifests.
Diffing against https://github.com/openjdk/jdk25u/blob/master/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
```
diff --git a/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java b/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
index a7821921bc9..cdc5e0b9ea6 100644
--- a/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
+++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
@@ -1297,7 +1297,7 @@ final void push(ForkJoinTask<?> task, ForkJoinPool pool, boolean internal) {
unlockPhase();
if (room < 0)
throw new RejectedExecutionException("Queue capacity exceeded");
- if ((room == 0 || a[m & (s - pk)] == null) &&
+ if ((room == 0 || U.getReferenceAcquire(a, slotOffset(m & (s - pk))) == null) &&
pool != null)
pool.signalWork(); // may have appeared empty
}
```
Unfortunately it is not feasible to add a regression test for this, as it very rarely manifests.
Diffing against https://github.com/openjdk/jdk25u/blob/master/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
```
diff --git a/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java b/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
index a7821921bc9..cdc5e0b9ea6 100644
--- a/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
+++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
@@ -1297,7 +1297,7 @@ final void push(ForkJoinTask<?> task, ForkJoinPool pool, boolean internal) {
unlockPhase();
if (room < 0)
throw new RejectedExecutionException("Queue capacity exceeded");
- if ((room == 0 || a[m & (s - pk)] == null) &&
+ if ((room == 0 || U.getReferenceAcquire(a, slotOffset(m & (s - pk))) == null) &&
pool != null)
pool.signalWork(); // may have appeared empty
}
```
- causes
-
JDK-8370264 Test java/util/stream/boottest/java.base/java/util/stream/DoubleNodeTest.java timed out
-
- Closed
-