diff --git a/common.json b/common.json index 7ccd1ceb0209..dcbd24971fb3 100644 --- a/common.json +++ b/common.json @@ -8,7 +8,7 @@ "COMMENT.jdks": "When adding or removing JDKs keep in sync with JDKs in ci/common.jsonnet", "jdks": { - "galahad-jdk": {"name": "jpg-jdk", "version": "25", "build_id": "jdk-26+6-469", "platformspecific": true, "extrabundles": ["static-libs"]}, + "galahad-jdk": {"name": "jpg-jdk", "version": "25", "build_id": "jdk-26+6-542", "platformspecific": true, "extrabundles": ["static-libs"]}, "oraclejdk17": {"name": "jpg-jdk", "version": "17.0.7", "build_id": "jdk-17.0.7+8", "platformspecific": true, "extrabundles": ["static-libs"]}, "labsjdk-ce-17": {"name": "labsjdk", "version": "ce-17.0.7+4-jvmci-23.1-b02", "platformspecific": true }, diff --git a/sdk/mx.sdk/mx_sdk_benchmark.py b/sdk/mx.sdk/mx_sdk_benchmark.py index a9f2e40ab376..b3b14ed80ec7 100644 --- a/sdk/mx.sdk/mx_sdk_benchmark.py +++ b/sdk/mx.sdk/mx_sdk_benchmark.py @@ -3277,6 +3277,13 @@ def renaissanceIterations(self): del benchmarks["gauss-mix"] del benchmarks["page-rank"] del benchmarks["movie-lens"] + if mx.get_jdk().javaCompliance >= '26': + # JDK-8361426 removes jdk.internal.ref.Cleaner and causes the following to fail + del benchmarks["als"] + del benchmarks["db-shootout"] + del benchmarks["dec-tree"] + del benchmarks["log-regression"] + del benchmarks["naive-bayes"] return benchmarks diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/ReferenceInternals.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/ReferenceInternals.java index ec6c061dc266..0d2f47ae55a7 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/ReferenceInternals.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/ReferenceInternals.java @@ -217,22 +217,11 @@ public static void processPendingReferences() { pendingList = ref.discovered; ref.discovered = null; - if (Target_jdk_internal_ref_Cleaner.class.isInstance(ref)) { - Target_jdk_internal_ref_Cleaner cleaner = Target_jdk_internal_ref_Cleaner.class.cast(ref); - // Cleaner catches all exceptions, cannot be overridden due to private c'tor - cleaner.clean(); - synchronized (processPendingLock) { - // Notify any waiters that progress has been made. This improves latency - // for nio.Bits waiters, which are the only important ones. - processPendingLock.notifyAll(); - } - } else { - @SuppressWarnings("unchecked") - Target_java_lang_ref_ReferenceQueue queue = SubstrateUtil.cast(ref.queue, Target_java_lang_ref_ReferenceQueue.class); - if (queue != Target_java_lang_ref_ReferenceQueue.NULL_QUEUE) { - // Enqueues, avoiding the potentially overridden Reference.enqueue(). - queue.enqueue(ref); - } + @SuppressWarnings("unchecked") + Target_java_lang_ref_ReferenceQueue queue = SubstrateUtil.cast(ref.queue, Target_java_lang_ref_ReferenceQueue.class); + if (queue != Target_java_lang_ref_ReferenceQueue.NULL_QUEUE) { + // Enqueues, avoiding the potentially overridden Reference.enqueue(). + queue.enqueue(ref); } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_jdk_internal_ref_Cleaner.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_Cleaner.java similarity index 92% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_jdk_internal_ref_Cleaner.java rename to substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_Cleaner.java index 309d4c8ca954..d6615a4da092 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_jdk_internal_ref_Cleaner.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_Cleaner.java @@ -41,17 +41,10 @@ import jdk.internal.misc.InnocuousThread; -@TargetClass(className = "jdk.internal.ref.Cleaner") -public final class Target_jdk_internal_ref_Cleaner { - - @Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset)// - static Target_jdk_internal_ref_Cleaner first; - - @Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)// - static ReferenceQueue dummyQueue = new ReferenceQueue<>(); - - @Alias - native void clean(); +@TargetClass(className = "java.lang.ref.Cleaner") +public final class Target_java_lang_ref_Cleaner { + @Alias// + public Target_jdk_internal_ref_CleanerImpl impl; } @TargetClass(className = "jdk.internal.ref.CleanerFactory") @@ -60,12 +53,6 @@ final class Target_jdk_internal_ref_CleanerFactory { public static native Target_java_lang_ref_Cleaner cleaner(); } -@TargetClass(className = "java.lang.ref.Cleaner") -final class Target_java_lang_ref_Cleaner { - @Alias// - public Target_jdk_internal_ref_CleanerImpl impl; -} - @TargetClass(className = "java.lang.ref.Cleaner$Cleanable") final class Target_java_lang_ref_Cleaner_Cleanable { @AnnotateOriginal diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/image/DisallowedImageHeapObjects.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/image/DisallowedImageHeapObjects.java index 6d741986bc5b..ea2c51f6f7ce 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/image/DisallowedImageHeapObjects.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/image/DisallowedImageHeapObjects.java @@ -59,7 +59,6 @@ public interface DisallowedObjectReporter { public static final Class CONTINUATION_CLASS = ReflectionUtil.lookupClass("jdk.internal.vm.Continuation"); private static final Method CONTINUATION_IS_STARTED_METHOD = ReflectionUtil.lookupMethod(CONTINUATION_CLASS, "isStarted"); private static final Class CLEANER_CLEANABLE_CLASS = ReflectionUtil.lookupClass("jdk.internal.ref.CleanerImpl$CleanerCleanable"); - public static final Class LEGACY_CLEANER_CLASS = ReflectionUtil.lookupClass("jdk.internal.ref.Cleaner"); public static final Class MEMORY_SEGMENT_CLASS = ReflectionUtil.lookupClass("java.lang.foreign.MemorySegment"); public static final Class SCOPE_CLASS = ReflectionUtil.lookupClass("java.lang.foreign.MemorySegment$Scope"); @@ -86,7 +85,7 @@ public static void check(Object obj, DisallowedObjectReporter reporter) { onBufferReachable(buffer, reporter); } - if (obj instanceof Cleaner.Cleanable || LEGACY_CLEANER_CLASS.isInstance(obj)) { + if (obj instanceof Cleaner.Cleanable) { onCleanableReachable(obj, reporter); } @@ -182,11 +181,11 @@ public static void onBufferReachable(Buffer buffer, DisallowedObjectReporter rep } public static void onCleanableReachable(Object cleanable, DisallowedObjectReporter reporter) { - VMError.guarantee(cleanable instanceof Cleaner.Cleanable || LEGACY_CLEANER_CLASS.isInstance(cleanable)); + VMError.guarantee(cleanable instanceof Cleaner.Cleanable); /* - * Cleanable and jdk.internal.ref.Cleaner are used to release various resources such as - * native memory, file descriptors, or timers, which are not available at image runtime. By - * disallowing these objects, we detect when such resources are reachable. + * Cleanable is used to release various resources such as native memory, file descriptors, + * or timers, which are not available at image runtime. By disallowing these objects, we + * detect when such resources are reachable. * * If a Cleanable is a nulled (Phantom)Reference, its problematic resource is already * unreachable, so we tolerate it. @@ -194,10 +193,6 @@ public static void onCleanableReachable(Object cleanable, DisallowedObjectReport * A CleanerCleanable serves only to keep a cleaner thread alive (without referencing the * Thread) and does nothing, so we also tolerate it. We should encounter at least one such * object for jdk.internal.ref.CleanerFactory.commonCleaner. - * - * Legacy jdk.internal.ref.Cleaner objects (formerly in sun.misc) should be used only by - * DirectByteBuffer, which we already cover above, but other code could also use them. If - * they have been nulled, we tolerate them, too. */ if (!(cleanable instanceof Reference && ((Reference) cleanable).refersTo(null)) && !CLEANER_CLEANABLE_CLASS.isInstance(cleanable)) { throw reporter.raise("Detected an active instance of Cleanable or jdk.internal.ref.Cleaner in the image heap. This usually means that a resource " + diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/DisallowedImageHeapObjectFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/DisallowedImageHeapObjectFeature.java index b68cf684b209..d59b5cfe6c8a 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/DisallowedImageHeapObjectFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/DisallowedImageHeapObjectFeature.java @@ -25,7 +25,6 @@ package com.oracle.svm.hosted.image; import static com.oracle.svm.core.image.DisallowedImageHeapObjects.CANCELLABLE_CLASS; -import static com.oracle.svm.core.image.DisallowedImageHeapObjects.LEGACY_CLEANER_CLASS; import static com.oracle.svm.core.image.DisallowedImageHeapObjects.MEMORY_SEGMENT_CLASS; import static com.oracle.svm.core.image.DisallowedImageHeapObjects.SCOPE_CLASS; @@ -85,7 +84,6 @@ public void duringSetup(DuringSetupAccess a) { access.registerObjectReachableCallback(FileDescriptor.class, (a1, obj, reason) -> DisallowedImageHeapObjects.onFileDescriptorReachable(obj, this::error)); access.registerObjectReachableCallback(Buffer.class, (a1, obj, reason) -> DisallowedImageHeapObjects.onBufferReachable(obj, this::error)); access.registerObjectReachableCallback(Cleaner.Cleanable.class, (a1, obj, reason) -> DisallowedImageHeapObjects.onCleanableReachable(obj, this::error)); - access.registerObjectReachableCallback(LEGACY_CLEANER_CLASS, (a1, obj, reason) -> DisallowedImageHeapObjects.onCleanableReachable(obj, this::error)); access.registerObjectReachableCallback(Cleaner.class, (a1, obj, reason) -> DisallowedImageHeapObjects.onCleanerReachable(obj, this::error)); access.registerObjectReachableCallback(ZipFile.class, (a1, obj, reason) -> DisallowedImageHeapObjects.onZipFileReachable(obj, this::error)); access.registerObjectReachableCallback(CANCELLABLE_CLASS, (a1, obj, reason) -> DisallowedImageHeapObjects.onCancellableReachable(obj, this::error)); diff --git a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/resources/jdk_allowed_methods.json b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/resources/jdk_allowed_methods.json index abdd1534f245..06fa2b1c7e86 100644 --- a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/resources/jdk_allowed_methods.json +++ b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/resources/jdk_allowed_methods.json @@ -339,16 +339,5 @@ "justification": "In native-image resource bundles are statically configured." } ] - }, - { - "name": "jdk.internal.ref.Cleaner", - "methods": [ - { - "name": "clean", - "parameterTypes" : [ - ], - "justification": "Internal JDK Cleaner which does System.exit if it fails during JVM boot." - } - ] } ]