Skip to content

Commit ef56566

Browse files
committed
[GR-9632] Classloader methods on Thread and ClassLoader.
PullRequest: graal/1727
2 parents dcd7153 + 37a8e8d commit ef56566

File tree

4 files changed

+24
-15
lines changed

4 files changed

+24
-15
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaLangSubstitutions.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import java.util.concurrent.ConcurrentMap;
5050
import java.util.concurrent.locks.ReentrantLock;
5151

52+
import org.graalvm.compiler.api.replacements.Fold;
5253
import org.graalvm.compiler.core.common.SuppressFBWarnings;
5354
import org.graalvm.compiler.word.ObjectAccess;
5455
import org.graalvm.compiler.word.Word;
@@ -737,9 +738,15 @@ static Package getPackage(Class<?> c) {
737738
/** Dummy class to have a class with the file's name. */
738739
public final class JavaLangSubstitutions {
739740

740-
@Platforms(Platform.HOSTED_ONLY.class)
741741
public static class ClassLoaderSupport {
742-
public Map<ClassLoader, Target_java_lang_ClassLoader> classloaders = Collections.synchronizedMap(new IdentityHashMap<>());
742+
public Target_java_lang_ClassLoader systemClassLoader;
743+
744+
@Platforms(Platform.HOSTED_ONLY.class) public Map<ClassLoader, Target_java_lang_ClassLoader> classLoaders = Collections.synchronizedMap(new IdentityHashMap<>());
745+
746+
@Fold
747+
public static ClassLoaderSupport getInstance() {
748+
return ImageSingletons.lookup(ClassLoaderSupport.class);
749+
}
743750
}
744751

745752
@Platforms(Platform.HOSTED_ONLY.class)//

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_java_lang_ClassLoader.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import com.oracle.svm.core.annotate.Substitute;
3636
import com.oracle.svm.core.annotate.TargetClass;
3737
import com.oracle.svm.core.hub.ClassForNameSupport;
38+
import com.oracle.svm.core.jdk.JavaLangSubstitutions.ClassLoaderSupport;
39+
import com.oracle.svm.core.snippets.KnownIntrinsics;
3840

3941
@TargetClass(ClassLoader.class)
4042
@Substitute
@@ -106,12 +108,7 @@ private static Enumeration<URL> getSystemResources(String name) {
106108

107109
@Substitute
108110
public static ClassLoader getSystemClassLoader() {
109-
/*
110-
* ClassLoader.getSystemClassLoader() is used as a parameter for Class.forName(String,
111-
* boolean, ClassLoader) which is implemented as ClassForNameSupport.forName(name) and
112-
* ignores the class loader.
113-
*/
114-
return null;
111+
return KnownIntrinsics.unsafeCast(ClassLoaderSupport.getInstance().systemClassLoader, ClassLoader.class);
115112
}
116113

117114
@Substitute

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/JavaThreads.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ final class Target_java_lang_Thread {
566566
@Inject @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.NewInstance, declClass = AtomicReference.class)//
567567
AtomicReference<ParkEvent> sleepParkEvent;
568568

569-
@Delete //
569+
@Alias//
570570
private ClassLoader contextClassLoader;
571571

572572
@Alias//
@@ -614,15 +614,13 @@ final class Target_java_lang_Thread {
614614
native void setPriority(int newPriority);
615615

616616
@Substitute
617-
@SuppressWarnings("static-method")
618617
public ClassLoader getContextClassLoader() {
619-
/* null indicates the system class loader */
620-
return null;
618+
return contextClassLoader;
621619
}
622620

623621
@Substitute
624622
public void setContextClassLoader(ClassLoader cl) {
625-
// noop
623+
contextClassLoader = cl;
626624
}
627625

628626
/** Replace "synchronized" modifier with delegation to an atomic increment. */
@@ -692,6 +690,7 @@ private void init(ThreadGroup g, Runnable target, String name, long stackSize) {
692690

693691
this.group = g;
694692
this.daemon = parent.isDaemon();
693+
contextClassLoader = parent.getContextClassLoader();
695694
this.priority = parent.getPriority();
696695
this.target = target;
697696
setPriority(priority);

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassLoaderFeature.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void afterRegistration(AfterRegistrationAccess access) {
4141
}
4242

4343
private void createClassLoaders(ClassLoader classLoader) {
44-
Map<ClassLoader, Target_java_lang_ClassLoader> classLoaders = ImageSingletons.lookup(ClassLoaderSupport.class).classloaders;
44+
Map<ClassLoader, Target_java_lang_ClassLoader> classLoaders = ClassLoaderSupport.getInstance().classLoaders;
4545
if (!classLoaders.containsKey(classLoader)) {
4646
ClassLoader parent = classLoader.getParent();
4747
if (parent != null) {
@@ -53,12 +53,18 @@ private void createClassLoaders(ClassLoader classLoader) {
5353
}
5454
}
5555

56+
@Override
57+
public void beforeAnalysis(BeforeAnalysisAccess access) {
58+
createClassLoaders(ClassLoader.getSystemClassLoader());
59+
ClassLoaderSupport.getInstance().systemClassLoader = ClassLoaderSupport.getInstance().classLoaders.get(ClassLoader.getSystemClassLoader());
60+
}
61+
5662
@Override
5763
public void duringSetup(DuringSetupAccess access) {
5864
access.registerObjectReplacer(object -> {
5965
if (object instanceof ClassLoader) {
6066
createClassLoaders((ClassLoader) object);
61-
return ImageSingletons.lookup(ClassLoaderSupport.class).classloaders.get(object);
67+
return ClassLoaderSupport.getInstance().classLoaders.get(object);
6268
}
6369
return object;
6470
});

0 commit comments

Comments
 (0)