< prev index next >

src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java

Print this page
rev 54697 : [mq]: 8218700

*** 382,392 **** @NativeImageReinitialize private volatile boolean creatingCompiler; /** * Cache for speeding up {@link #fromClass(Class)}. */ ! @NativeImageReinitialize private volatile ClassValue<WeakReference<HotSpotResolvedJavaType>> resolvedJavaType; @NativeImageReinitialize private HashMap<Long, WeakReference<ResolvedJavaType>> resolvedJavaTypes; /** * Stores the value set by {@link #excludeFromJVMCICompilation(Module...)} so that it can --- 382,410 ---- @NativeImageReinitialize private volatile boolean creatingCompiler; /** * Cache for speeding up {@link #fromClass(Class)}. */ ! @NativeImageReinitialize private volatile ClassValue<WeakReferenceHolder<HotSpotResolvedJavaType>> resolvedJavaType; ! ! /** ! * To avoid calling ClassValue.remove to refresh the weak reference, which ! * under certain circumstances can lead to an infinite loop, we use a ! * permanent holder with a mutable field that we refresh. ! */ ! private static class WeakReferenceHolder<T> { ! private volatile WeakReference<T> ref; ! WeakReferenceHolder(T value) { ! set(value); ! } ! void set(T value) { ! ref = new WeakReference<T>(value); ! } ! T get() { ! return ref.get(); ! } ! }; @NativeImageReinitialize private HashMap<Long, WeakReference<ResolvedJavaType>> resolvedJavaTypes; /** * Stores the value set by {@link #excludeFromJVMCICompilation(Module...)} so that it can
*** 484,514 **** private HotSpotResolvedJavaType fromClass0(Class<?> javaClass) { if (resolvedJavaType == null) { synchronized (this) { if (resolvedJavaType == null) { ! resolvedJavaType = new ClassValue<WeakReference<HotSpotResolvedJavaType>>() { @Override ! protected WeakReference<HotSpotResolvedJavaType> computeValue(Class<?> type) { ! return new WeakReference<>(createClass(type)); } }; } } } ! HotSpotResolvedJavaType javaType = null; ! while (javaType == null) { ! WeakReference<HotSpotResolvedJavaType> type = resolvedJavaType.get(javaClass); ! javaType = type.get(); if (javaType == null) { /* ! * If the referent has become null, clear out the current value and let computeValue ! * above create a new value. Reload the value in a loop because in theory the ! * WeakReference referent can be reclaimed at any point. */ ! resolvedJavaType.remove(javaClass); ! } } return javaType; } /** --- 502,530 ---- private HotSpotResolvedJavaType fromClass0(Class<?> javaClass) { if (resolvedJavaType == null) { synchronized (this) { if (resolvedJavaType == null) { ! resolvedJavaType = new ClassValue<WeakReferenceHolder<HotSpotResolvedJavaType>>() { @Override ! protected WeakReferenceHolder<HotSpotResolvedJavaType> computeValue(Class<?> type) { ! return new WeakReferenceHolder<>(createClass(type)); } }; } } } ! ! WeakReferenceHolder<HotSpotResolvedJavaType> ref = resolvedJavaType.get(javaClass); ! HotSpotResolvedJavaType javaType = ref.get(); if (javaType == null) { /* ! * If the referent has become null, create a new value and ! * update cached weak reference. */ ! javaType = createClass(javaClass); ! ref.set(javaType); } return javaType; } /**
< prev index next >