8294278: ForkJoinPool.getAndAddPoolIds should use Unsafe.staticFieldBase

Reviewed-by: burban, chegar, martin
This commit is contained in:
Alan Bateman 2022-12-01 10:40:36 +00:00
parent eea1a8a95e
commit cd776093c7
2 changed files with 17 additions and 5 deletions

View file

@ -25,6 +25,7 @@
package java.lang;
import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.AccessControlContext;
import java.security.Permission;
@ -1107,14 +1108,21 @@ public class Thread implements Runnable {
*/
private static class ThreadNumbering {
private static final Unsafe U;
private static final long NEXT;
private static final Object NEXT_BASE;
private static final long NEXT_OFFSET;
static {
U = Unsafe.getUnsafe();
NEXT = U.objectFieldOffset(ThreadNumbering.class, "next");
try {
Field nextField = ThreadNumbering.class.getDeclaredField("next");
NEXT_BASE = U.staticFieldBase(nextField);
NEXT_OFFSET = U.staticFieldOffset(nextField);
} catch (NoSuchFieldException e) {
throw new ExceptionInInitializerError(e);
}
}
private static volatile int next;
static int next() {
return U.getAndAddInt(ThreadNumbering.class, NEXT, 1);
return U.getAndAddInt(NEXT_BASE, NEXT_OFFSET, 1);
}
}

View file

@ -36,6 +36,7 @@
package java.util.concurrent;
import java.lang.Thread.UncaughtExceptionHandler;
import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.AccessControlContext;
import java.security.Permission;
@ -1527,6 +1528,7 @@ public class ForkJoinPool extends AbstractExecutorService {
private static final long RUNSTATE;
private static final long PARALLELISM;
private static final long THREADIDS;
private static final Object POOLIDS_BASE;
private static final long POOLIDS;
private boolean compareAndSetCtl(long c, long v) {
@ -1545,7 +1547,7 @@ public class ForkJoinPool extends AbstractExecutorService {
return U.getAndAddLong(this, THREADIDS, 1L);
}
private static int getAndAddPoolIds(int x) {
return U.getAndAddInt(ForkJoinPool.class, POOLIDS, x);
return U.getAndAddInt(POOLIDS_BASE, POOLIDS, x);
}
private int getAndSetParallelism(int v) {
return U.getAndSetInt(this, PARALLELISM, v);
@ -3763,7 +3765,9 @@ public class ForkJoinPool extends AbstractExecutorService {
U = Unsafe.getUnsafe();
Class<ForkJoinPool> klass = ForkJoinPool.class;
try {
POOLIDS = U.staticFieldOffset(klass.getDeclaredField("poolIds"));
Field poolIdsField = klass.getDeclaredField("poolIds");
POOLIDS_BASE = U.staticFieldBase(poolIdsField);
POOLIDS = U.staticFieldOffset(poolIdsField);
} catch (NoSuchFieldException e) {
throw new ExceptionInInitializerError(e);
}