# HG changeset patch # User dnsimon # Date 1465345011 25200 # Node ID 6f1681fea93729844892023ca78841a52ff6d2a7 # Parent d139a133ba270086ecf4dc863663b3841c470dd6 8158985: [JVMCI] access to HotSpotJVMCIRuntime.vmEventListeners must be thread safe Reviewed-by: iveresov, kvn diff -r d139a133ba27 -r 6f1681fea937 hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java --- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java Tue Jun 07 18:20:44 2016 +0200 +++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java Tue Jun 07 17:16:51 2016 -0700 @@ -31,10 +31,13 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.ServiceLoader; import java.util.TreeMap; import jdk.internal.misc.VM; @@ -213,7 +216,22 @@ private final Map, JVMCIBackend> backends = new HashMap<>(); - private final Iterable vmEventListeners; + private volatile List vmEventListeners; + + private Iterable getVmEventListeners() { + if (vmEventListeners == null) { + synchronized (this) { + if (vmEventListeners == null) { + List listeners = new ArrayList<>(); + for (HotSpotVMEventListener vmEventListener : ServiceLoader.load(HotSpotVMEventListener.class)) { + listeners.add(vmEventListener); + } + vmEventListeners = listeners; + } + } + } + return vmEventListeners; + } /** * Stores the result of {@link HotSpotJVMCICompilerFactory#getTrivialPrefixes()} so that it can @@ -240,8 +258,6 @@ hostBackend = registerBackend(factory.createJVMCIBackend(this, null)); } - vmEventListeners = Services.load(HotSpotVMEventListener.class); - metaAccessContext = new HotSpotJVMCIMetaAccessContext(); boolean printFlags = Option.PrintFlags.getBoolean(); @@ -370,7 +386,7 @@ */ @SuppressWarnings({"unused"}) private void shutdown() throws Exception { - for (HotSpotVMEventListener vmEventListener : vmEventListeners) { + for (HotSpotVMEventListener vmEventListener : getVmEventListeners()) { vmEventListener.notifyShutdown(); } } @@ -382,7 +398,7 @@ */ @SuppressWarnings({"unused"}) private void bootstrapFinished() throws Exception { - for (HotSpotVMEventListener vmEventListener : vmEventListeners) { + for (HotSpotVMEventListener vmEventListener : getVmEventListeners()) { vmEventListener.notifyBootstrapFinished(); } } @@ -395,7 +411,7 @@ * @param compiledCode */ void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider, InstalledCode installedCode, CompiledCode compiledCode) { - for (HotSpotVMEventListener vmEventListener : vmEventListeners) { + for (HotSpotVMEventListener vmEventListener : getVmEventListeners()) { vmEventListener.notifyInstall(hotSpotCodeCacheProvider, installedCode, compiledCode); } }