src/jdk/internal/dynalink/support/CallSiteDescriptorFactory.java

changeset 963
e2497b11a021
parent 962
ac62e33a99b0
child 1205
4112748288bb
child 1231
701c1dcdf733
     1.1 --- a/src/jdk/internal/dynalink/support/CallSiteDescriptorFactory.java	Wed Aug 20 10:25:28 2014 +0200
     1.2 +++ b/src/jdk/internal/dynalink/support/CallSiteDescriptorFactory.java	Wed Aug 20 10:26:01 2014 +0200
     1.3 @@ -86,6 +86,7 @@
     1.4  import java.lang.invoke.MethodHandles;
     1.5  import java.lang.invoke.MethodHandles.Lookup;
     1.6  import java.lang.invoke.MethodType;
     1.7 +import java.lang.ref.Reference;
     1.8  import java.lang.ref.WeakReference;
     1.9  import java.util.Arrays;
    1.10  import java.util.Collections;
    1.11 @@ -103,7 +104,7 @@
    1.12   * @author Attila Szegedi
    1.13   */
    1.14  public class CallSiteDescriptorFactory {
    1.15 -    private static final WeakHashMap<CallSiteDescriptor, WeakReference<CallSiteDescriptor>> publicDescs =
    1.16 +    private static final WeakHashMap<CallSiteDescriptor, Reference<CallSiteDescriptor>> publicDescs =
    1.17              new WeakHashMap<>();
    1.18  
    1.19  
    1.20 @@ -134,18 +135,27 @@
    1.21  
    1.22      static CallSiteDescriptor getCanonicalPublicDescriptor(final CallSiteDescriptor desc) {
    1.23          synchronized(publicDescs) {
    1.24 -            final WeakReference<CallSiteDescriptor> ref = publicDescs.get(desc);
    1.25 +            final Reference<CallSiteDescriptor> ref = publicDescs.get(desc);
    1.26              if(ref != null) {
    1.27                  final CallSiteDescriptor canonical = ref.get();
    1.28                  if(canonical != null) {
    1.29                      return canonical;
    1.30                  }
    1.31              }
    1.32 -            publicDescs.put(desc, new WeakReference<>(desc));
    1.33 +            publicDescs.put(desc, createReference(desc));
    1.34          }
    1.35          return desc;
    1.36      }
    1.37  
    1.38 +    /**
    1.39 +     * Override this to use a different kind of references for the cache
    1.40 +     * @param desc desc
    1.41 +     * @return reference
    1.42 +     */
    1.43 +    protected static Reference<CallSiteDescriptor> createReference(final CallSiteDescriptor desc) {
    1.44 +        return new WeakReference<>(desc);
    1.45 +    }
    1.46 +
    1.47      private static CallSiteDescriptor createPublicCallSiteDescriptor(final String[] tokenizedName, final MethodType methodType) {
    1.48          final int l = tokenizedName.length;
    1.49          if(l > 0 && tokenizedName[0] == "dyn") {

mercurial