Skip to content

Commit c446632

Browse files
committed
Adapt JDK-8361426: (ref) Remove jdk.internal.ref.Cleaner
1 parent 51fc346 commit c446632

File tree

6 files changed

+21
-56
lines changed

6 files changed

+21
-56
lines changed

sdk/mx.sdk/mx_sdk_benchmark.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3277,6 +3277,13 @@ def renaissanceIterations(self):
32773277
del benchmarks["gauss-mix"]
32783278
del benchmarks["page-rank"]
32793279
del benchmarks["movie-lens"]
3280+
if mx.get_jdk().javaCompliance >= '26':
3281+
# JDK-8361426 removes jdk.internal.ref.Cleaner and causes the following to fail
3282+
del benchmarks["als"]
3283+
del benchmarks["db-shootout"]
3284+
del benchmarks["dec-tree"]
3285+
del benchmarks["log-regression"]
3286+
del benchmarks["naive-bayes"]
32803287

32813288
return benchmarks
32823289

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/ReferenceInternals.java

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -217,22 +217,11 @@ public static void processPendingReferences() {
217217
pendingList = ref.discovered;
218218
ref.discovered = null;
219219

220-
if (Target_jdk_internal_ref_Cleaner.class.isInstance(ref)) {
221-
Target_jdk_internal_ref_Cleaner cleaner = Target_jdk_internal_ref_Cleaner.class.cast(ref);
222-
// Cleaner catches all exceptions, cannot be overridden due to private c'tor
223-
cleaner.clean();
224-
synchronized (processPendingLock) {
225-
// Notify any waiters that progress has been made. This improves latency
226-
// for nio.Bits waiters, which are the only important ones.
227-
processPendingLock.notifyAll();
228-
}
229-
} else {
230-
@SuppressWarnings("unchecked")
231-
Target_java_lang_ref_ReferenceQueue<? super Object> queue = SubstrateUtil.cast(ref.queue, Target_java_lang_ref_ReferenceQueue.class);
232-
if (queue != Target_java_lang_ref_ReferenceQueue.NULL_QUEUE) {
233-
// Enqueues, avoiding the potentially overridden Reference.enqueue().
234-
queue.enqueue(ref);
235-
}
220+
@SuppressWarnings("unchecked")
221+
Target_java_lang_ref_ReferenceQueue<? super Object> queue = SubstrateUtil.cast(ref.queue, Target_java_lang_ref_ReferenceQueue.class);
222+
if (queue != Target_java_lang_ref_ReferenceQueue.NULL_QUEUE) {
223+
// Enqueues, avoiding the potentially overridden Reference.enqueue().
224+
queue.enqueue(ref);
236225
}
237226
}
238227

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,10 @@
4141

4242
import jdk.internal.misc.InnocuousThread;
4343

44-
@TargetClass(className = "jdk.internal.ref.Cleaner")
45-
public final class Target_jdk_internal_ref_Cleaner {
46-
47-
@Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset)//
48-
static Target_jdk_internal_ref_Cleaner first;
49-
50-
@Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)//
51-
static ReferenceQueue<Object> dummyQueue = new ReferenceQueue<>();
52-
53-
@Alias
54-
native void clean();
44+
@TargetClass(className = "java.lang.ref.Cleaner")
45+
public final class Target_java_lang_ref_Cleaner {
46+
@Alias//
47+
public Target_jdk_internal_ref_CleanerImpl impl;
5548
}
5649

5750
@TargetClass(className = "jdk.internal.ref.CleanerFactory")
@@ -60,12 +53,6 @@ final class Target_jdk_internal_ref_CleanerFactory {
6053
public static native Target_java_lang_ref_Cleaner cleaner();
6154
}
6255

63-
@TargetClass(className = "java.lang.ref.Cleaner")
64-
final class Target_java_lang_ref_Cleaner {
65-
@Alias//
66-
public Target_jdk_internal_ref_CleanerImpl impl;
67-
}
68-
6956
@TargetClass(className = "java.lang.ref.Cleaner$Cleanable")
7057
final class Target_java_lang_ref_Cleaner_Cleanable {
7158
@AnnotateOriginal

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/image/DisallowedImageHeapObjects.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ public interface DisallowedObjectReporter {
5959
public static final Class<?> CONTINUATION_CLASS = ReflectionUtil.lookupClass("jdk.internal.vm.Continuation");
6060
private static final Method CONTINUATION_IS_STARTED_METHOD = ReflectionUtil.lookupMethod(CONTINUATION_CLASS, "isStarted");
6161
private static final Class<?> CLEANER_CLEANABLE_CLASS = ReflectionUtil.lookupClass("jdk.internal.ref.CleanerImpl$CleanerCleanable");
62-
public static final Class<?> LEGACY_CLEANER_CLASS = ReflectionUtil.lookupClass("jdk.internal.ref.Cleaner");
6362
public static final Class<?> MEMORY_SEGMENT_CLASS = ReflectionUtil.lookupClass("java.lang.foreign.MemorySegment");
6463
public static final Class<?> SCOPE_CLASS = ReflectionUtil.lookupClass("java.lang.foreign.MemorySegment$Scope");
6564

@@ -86,7 +85,7 @@ public static void check(Object obj, DisallowedObjectReporter reporter) {
8685
onBufferReachable(buffer, reporter);
8786
}
8887

89-
if (obj instanceof Cleaner.Cleanable || LEGACY_CLEANER_CLASS.isInstance(obj)) {
88+
if (obj instanceof Cleaner.Cleanable) {
9089
onCleanableReachable(obj, reporter);
9190
}
9291

@@ -182,22 +181,18 @@ public static void onBufferReachable(Buffer buffer, DisallowedObjectReporter rep
182181
}
183182

184183
public static void onCleanableReachable(Object cleanable, DisallowedObjectReporter reporter) {
185-
VMError.guarantee(cleanable instanceof Cleaner.Cleanable || LEGACY_CLEANER_CLASS.isInstance(cleanable));
184+
VMError.guarantee(cleanable instanceof Cleaner.Cleanable);
186185
/*
187-
* Cleanable and jdk.internal.ref.Cleaner are used to release various resources such as
188-
* native memory, file descriptors, or timers, which are not available at image runtime. By
189-
* disallowing these objects, we detect when such resources are reachable.
186+
* Cleanable is used to release various resources such as native memory, file descriptors,
187+
* or timers, which are not available at image runtime. By disallowing these objects, we
188+
* detect when such resources are reachable.
190189
*
191190
* If a Cleanable is a nulled (Phantom)Reference, its problematic resource is already
192191
* unreachable, so we tolerate it.
193192
*
194193
* A CleanerCleanable serves only to keep a cleaner thread alive (without referencing the
195194
* Thread) and does nothing, so we also tolerate it. We should encounter at least one such
196195
* object for jdk.internal.ref.CleanerFactory.commonCleaner.
197-
*
198-
* Legacy jdk.internal.ref.Cleaner objects (formerly in sun.misc) should be used only by
199-
* DirectByteBuffer, which we already cover above, but other code could also use them. If
200-
* they have been nulled, we tolerate them, too.
201196
*/
202197
if (!(cleanable instanceof Reference<?> && ((Reference<?>) cleanable).refersTo(null)) && !CLEANER_CLEANABLE_CLASS.isInstance(cleanable)) {
203198
throw reporter.raise("Detected an active instance of Cleanable or jdk.internal.ref.Cleaner in the image heap. This usually means that a resource " +

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/DisallowedImageHeapObjectFeature.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
package com.oracle.svm.hosted.image;
2626

2727
import static com.oracle.svm.core.image.DisallowedImageHeapObjects.CANCELLABLE_CLASS;
28-
import static com.oracle.svm.core.image.DisallowedImageHeapObjects.LEGACY_CLEANER_CLASS;
2928
import static com.oracle.svm.core.image.DisallowedImageHeapObjects.MEMORY_SEGMENT_CLASS;
3029
import static com.oracle.svm.core.image.DisallowedImageHeapObjects.SCOPE_CLASS;
3130

@@ -85,7 +84,6 @@ public void duringSetup(DuringSetupAccess a) {
8584
access.registerObjectReachableCallback(FileDescriptor.class, (a1, obj, reason) -> DisallowedImageHeapObjects.onFileDescriptorReachable(obj, this::error));
8685
access.registerObjectReachableCallback(Buffer.class, (a1, obj, reason) -> DisallowedImageHeapObjects.onBufferReachable(obj, this::error));
8786
access.registerObjectReachableCallback(Cleaner.Cleanable.class, (a1, obj, reason) -> DisallowedImageHeapObjects.onCleanableReachable(obj, this::error));
88-
access.registerObjectReachableCallback(LEGACY_CLEANER_CLASS, (a1, obj, reason) -> DisallowedImageHeapObjects.onCleanableReachable(obj, this::error));
8987
access.registerObjectReachableCallback(Cleaner.class, (a1, obj, reason) -> DisallowedImageHeapObjects.onCleanerReachable(obj, this::error));
9088
access.registerObjectReachableCallback(ZipFile.class, (a1, obj, reason) -> DisallowedImageHeapObjects.onZipFileReachable(obj, this::error));
9189
access.registerObjectReachableCallback(CANCELLABLE_CLASS, (a1, obj, reason) -> DisallowedImageHeapObjects.onCancellableReachable(obj, this::error));

substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/resources/jdk_allowed_methods.json

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -339,16 +339,5 @@
339339
"justification": "In native-image resource bundles are statically configured."
340340
}
341341
]
342-
},
343-
{
344-
"name": "jdk.internal.ref.Cleaner",
345-
"methods": [
346-
{
347-
"name": "clean",
348-
"parameterTypes" : [
349-
],
350-
"justification": "Internal JDK Cleaner which does System.exit if it fails during JVM boot."
351-
}
352-
]
353342
}
354343
]

0 commit comments

Comments
 (0)