From debaf274b92fbb2ff6546a2c6dedab801bdcdce7 Mon Sep 17 00:00:00 2001 From: Doug Lea Date: Wed, 17 Dec 2025 07:51:14 -0500 Subject: [PATCH] Another diagnostic --- .../java/util/concurrent/ForkJoinPool.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) 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 e504f5fc908..04a461dd64f 100644 --- a/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java +++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java @@ -1256,27 +1256,27 @@ public class ForkJoinPool extends AbstractExecutorService final void push(ForkJoinTask task, ForkJoinPool pool, boolean internal) { int s = top++; // back out on failure ForkJoinTask[] a = array; - int size = s - base + 1, m; - if (((a != null && a.length > size) || (a = growArray(a, s)) != null) && - (m = a.length - 1) >= 0) { - a[m & s] = task; + int size = s - base + 1, room, cap, m; + if (a != null && + ((room = a.length - size) > 0 || (a = growArray(s)) != null) && + (cap = a.length) > 0) { + a[(m = cap - 1) & s] = task; if (!internal) unlockPhase(); - if (U.getReferenceAcquire(a, slotOffset(m & (s - 1))) == null && - pool != null) + if ((U.getReferenceAcquire(a, slotOffset(m & (s - 1))) == null || + room <= 0) && pool != null) pool.signalWork(this, s); // may have appeared empty } } /** * Resizes the queue array unless out of memory. - * @param a old array - * @param s current top + * @param s current (in-progress) top * @return new array (or throws on OOME) */ - private ForkJoinTask[] growArray(ForkJoinTask[] a, int s) { - int cap, newCap; - if (a != null && (cap = a.length) > 0 && + private ForkJoinTask[] growArray(int s) { + ForkJoinTask[] a; int cap, newCap; + if ((a = array) != null && (cap = a.length) > 0 && (newCap = (cap >= 1 << 16) ? cap << 1 : cap << 2) > 0) { ForkJoinTask[] newArray = null; try { @@ -2026,11 +2026,11 @@ public class ForkJoinPool extends AbstractExecutorService } else if (U.compareAndSetReference(a, bp, t, null)) { q.base = nb; - Object nt = U.getReferenceAcquire(a, np); + U.storeFence(); rescans = 1; if (taken++ == 0 || qid != src) w.source = src = qid; - if (nt != null && q.base == nb) + if (U.getReferenceAcquire(a, np) != null) signalWork(q, nb); // propagate w.topLevelExec(t, fifo); }