src/jdk/internal/dynalink/DynamicLinkerFactory.java

changeset 488
9a3e3bb30db3
parent 101
f8221ce53c2e
child 494
3c13fba4d727
     1.1 --- a/src/jdk/internal/dynalink/DynamicLinkerFactory.java	Thu Aug 01 12:23:38 2013 +0200
     1.2 +++ b/src/jdk/internal/dynalink/DynamicLinkerFactory.java	Wed Aug 07 16:38:44 2013 +0200
     1.3 @@ -84,6 +84,8 @@
     1.4  package jdk.internal.dynalink;
     1.5  
     1.6  import java.lang.invoke.MutableCallSite;
     1.7 +import java.security.AccessController;
     1.8 +import java.security.PrivilegedAction;
     1.9  import java.util.ArrayList;
    1.10  import java.util.Arrays;
    1.11  import java.util.Collections;
    1.12 @@ -117,7 +119,9 @@
    1.13       */
    1.14      public static final int DEFAULT_UNSTABLE_RELINK_THRESHOLD = 8;
    1.15  
    1.16 -    private ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    1.17 +    private boolean classLoaderExplicitlySet = false;
    1.18 +    private ClassLoader classLoader;
    1.19 +
    1.20      private List<? extends GuardingDynamicLinker> prioritizedLinkers;
    1.21      private List<? extends GuardingDynamicLinker> fallbackLinkers;
    1.22      private int runtimeContextArgCount = 0;
    1.23 @@ -126,12 +130,13 @@
    1.24  
    1.25      /**
    1.26       * Sets the class loader for automatic discovery of available linkers. If not set explicitly, then the thread
    1.27 -     * context class loader at the time of the constructor invocation will be used.
    1.28 +     * context class loader at the time of {@link #createLinker()} invocation will be used.
    1.29       *
    1.30       * @param classLoader the class loader used for the autodiscovery of available linkers.
    1.31       */
    1.32      public void setClassLoader(ClassLoader classLoader) {
    1.33          this.classLoader = classLoader;
    1.34 +        classLoaderExplicitlySet = true;
    1.35      }
    1.36  
    1.37      /**
    1.38 @@ -260,7 +265,8 @@
    1.39          addClasses(knownLinkerClasses, prioritizedLinkers);
    1.40          addClasses(knownLinkerClasses, fallbackLinkers);
    1.41  
    1.42 -        final List<GuardingDynamicLinker> discovered = AutoDiscovery.loadLinkers(classLoader);
    1.43 +        final ClassLoader effectiveClassLoader = classLoaderExplicitlySet ? classLoader : getThreadContextClassLoader();
    1.44 +        final List<GuardingDynamicLinker> discovered = AutoDiscovery.loadLinkers(effectiveClassLoader);
    1.45          // Now, concatenate ...
    1.46          final List<GuardingDynamicLinker> linkers =
    1.47                  new ArrayList<>(prioritizedLinkers.size() + discovered.size()
    1.48 @@ -303,6 +309,15 @@
    1.49                  runtimeContextArgCount, syncOnRelink, unstableRelinkThreshold);
    1.50      }
    1.51  
    1.52 +    private static ClassLoader getThreadContextClassLoader() {
    1.53 +        return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
    1.54 +            @Override
    1.55 +            public ClassLoader run() {
    1.56 +                return Thread.currentThread().getContextClassLoader();
    1.57 +            }
    1.58 +        });
    1.59 +    }
    1.60 +
    1.61      private static void addClasses(Set<Class<? extends GuardingDynamicLinker>> knownLinkerClasses,
    1.62              List<? extends GuardingDynamicLinker> linkers) {
    1.63          for(GuardingDynamicLinker linker: linkers) {

mercurial