src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.runtime/src/jdk/vm/ci/runtime/JVMCI.java
Index Unified diffs Context diffs Sdiffs Frames Patch New Old Previous File Next File
*** old/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.runtime/src/jdk/vm/ci/runtime/JVMCI.java	Thu Mar 28 11:24:27 2019
--- new/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.runtime/src/jdk/vm/ci/runtime/JVMCI.java	Thu Mar 28 11:24:27 2019

*** 1,7 **** --- 1,7 ---- /* ! * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 22,63 **** --- 22,80 ---- */ package jdk.vm.ci.runtime; import java.util.Formatter; + import jdk.vm.ci.common.NativeImageReinitialize; + import jdk.vm.ci.services.Services; + public class JVMCI { private static final JVMCIRuntime runtime; + /** + * Singleton instance lazily initialized via double-checked locking. + */ + @NativeImageReinitialize private static volatile JVMCIRuntime runtime; ! private static native JVMCIRuntime initializeRuntime(); ! @NativeImageReinitialize private static boolean initializing; public static void initialize() { // force static initializer } + private static native JVMCIRuntime initializeRuntime(); + /** * Gets the singleton {@link JVMCIRuntime} instance available to the application. * * @throws UnsupportedOperationException if JVMCI is not supported */ public static JVMCIRuntime getRuntime() { if (runtime == null) { String javaHome = System.getProperty("java.home"); String vmName = System.getProperty("java.vm.name"); + JVMCIRuntime result = runtime; + if (result == null) { + synchronized (JVMCI.class) { + result = runtime; + if (result == null) { + if (initializing) { + // In recursive call from HotSpotJVMCIRuntime.runtime + // so no need to re-enter initializeRuntime below. This + // path is only entered if JVMCI initialization starts + // with JVMCI.getRuntime(). + return null; + } + initializing = true; + try { + runtime = result = initializeRuntime(); + } catch (UnsatisfiedLinkError e) { + String javaHome = Services.getSavedProperty("java.home"); + String vmName = Services.getSavedProperty("java.vm.name"); Formatter errorMessage = new Formatter(); errorMessage.format("The VM does not support the JVMCI API.%n"); errorMessage.format("Currently used Java home directory is %s.%n", javaHome); errorMessage.format("Currently used VM configuration is: %s", vmName); throw new UnsupportedOperationException(errorMessage.toString()); } return runtime; } static { JVMCIRuntime rt = null; try { rt = initializeRuntime(); } catch (UnsatisfiedLinkError e) { } runtime = rt; + } + return result; } }

src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.runtime/src/jdk/vm/ci/runtime/JVMCI.java
Index Unified diffs Context diffs Sdiffs Frames Patch New Old Previous File Next File