From 023114f9aab0be186a1633210c5b0aa2237be330 Mon Sep 17 00:00:00 2001 From: Christian Wirth Date: Thu, 28 Nov 2024 15:25:27 +0100 Subject: [PATCH] add Alias for ConcurrentHashMap.NCPU and similar --- .../svm/core/jdk/JavaUtilSubstitutions.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaUtilSubstitutions.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaUtilSubstitutions.java index 1e79daf96c57..d85cd9cc1c51 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaUtilSubstitutions.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaUtilSubstitutions.java @@ -37,6 +37,7 @@ import com.oracle.svm.core.SubstrateUtil; import com.oracle.svm.core.annotate.Alias; import com.oracle.svm.core.annotate.Inject; +import com.oracle.svm.core.annotate.InjectAccessors; import com.oracle.svm.core.annotate.RecomputeFieldValue; import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind; import com.oracle.svm.core.annotate.Substitute; @@ -150,6 +151,46 @@ final class Target_java_util_concurrent_ConcurrentHashMap { @Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset)// Target_java_util_concurrent_ConcurrentHashMap_EntrySetView entrySet; + @Alias @InjectAccessors(NCPUAccessor.class) // + private static int NCPU; +} + +final class NCPUAccessor { + private static int cachedNCPU = -1; + + static int get() { + if (cachedNCPU != -1) { + return cachedNCPU; + } + return initializeNCPU(); + } + + private static synchronized int initializeNCPU() { + if (cachedNCPU != -1) { + return cachedNCPU; + } + + cachedNCPU = Runtime.getRuntime().availableProcessors(); + return cachedNCPU; + } + + static synchronized void set(int value) { + cachedNCPU = value; + } +} + +@TargetClass(java.util.concurrent.Phaser.class) +final class Target_java_util_concurrent_Phaser { + + @Alias @InjectAccessors(NCPUAccessor.class) // + private static int NCPU; +} + +@TargetClass(className = "java.util.concurrent.atomic.Striped64") +final class Target_java_util_concurrent_atomic_Striped64 { + + @Alias @InjectAccessors(NCPUAccessor.class) // + private static int NCPU; } @TargetClass(value = java.util.concurrent.ConcurrentHashMap.class, innerClass = "KeySetView") @@ -289,6 +330,37 @@ public boolean getAsBoolean() { } } +@TargetClass(className = "java.util.concurrent.LinkedTransferQueue", innerClass = "DualNode") +final class Target_java_util_concurrent_LinkedTransferQueue_DualNode { + + @Alias @InjectAccessors(LinkedTransferQueueDualNodeIsUniprocessorAccessor.class) // + private static boolean isUniprocessor; +} + +final class LinkedTransferQueueDualNodeIsUniprocessorAccessor { + private static Boolean cachedIsUniprocessor = null; + + static boolean get() { + if (cachedIsUniprocessor != null) { + return cachedIsUniprocessor; + } + return initializeIsUniprocessor(); + } + + static void set(boolean value) { + cachedIsUniprocessor = value; + } + + private static synchronized boolean initializeIsUniprocessor() { + if (cachedIsUniprocessor != null) { + return cachedIsUniprocessor; + } + + cachedIsUniprocessor = Runtime.getRuntime().availableProcessors() == 1; + return cachedIsUniprocessor; + } +} + /** Dummy class to have a class with the file's name. */ public final class JavaUtilSubstitutions { }