This commit is contained in:
Doug Simon 2016-10-18 15:15:51 +00:00
commit 8302237d39
20 changed files with 180 additions and 144 deletions

View File

@ -20,17 +20,13 @@
* or visit www.oracle.com if you need additional information or have any * or visit www.oracle.com if you need additional information or have any
* questions. * questions.
*/ */
package jdk.vm.ci.hotspot.services; package jdk.vm.ci.hotspot;
/** /**
* An empty implementation for {@link EventProvider}. This implementation is used when no logging is * An empty implementation for {@link EventProvider}. This implementation is used when no logging is
* requested. * requested.
*/ */
final class EmptyEventProvider extends EventProvider { final class EmptyEventProvider implements EventProvider {
EmptyEventProvider() {
super(null);
}
static InternalError shouldNotReachHere() { static InternalError shouldNotReachHere() {
throw new InternalError("should not reach here"); throw new InternalError("should not reach here");

View File

@ -20,58 +20,36 @@
* or visit www.oracle.com if you need additional information or have any * or visit www.oracle.com if you need additional information or have any
* questions. * questions.
*/ */
package jdk.vm.ci.hotspot.services; package jdk.vm.ci.hotspot;
import jdk.vm.ci.hotspot.services.EmptyEventProvider.EmptyCompilationEvent; import jdk.vm.ci.hotspot.EmptyEventProvider.EmptyCompilationEvent;
import jdk.vm.ci.hotspot.services.EmptyEventProvider.EmptyCompilerFailureEvent; import jdk.vm.ci.hotspot.EmptyEventProvider.EmptyCompilerFailureEvent;
import jdk.vm.ci.services.JVMCIPermission; import jdk.vm.ci.services.JVMCIPermission;
/** /**
* Service-provider class for logging compiler related events. * Service-provider class for logging compiler related events.
*/ */
public abstract class EventProvider { public interface EventProvider {
private static Void checkPermission() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new JVMCIPermission());
}
return null;
}
@SuppressWarnings("unused")
EventProvider(Void ignore) {
}
/**
* Initializes a new instance of this class.
*
* @throws SecurityException if a security manager has been installed and it denies
* {@link JVMCIPermission}
*/
protected EventProvider() {
this(checkPermission());
}
/** /**
* Creates and returns an empty implementation for {@link EventProvider}. This implementation * Creates and returns an empty implementation for {@link EventProvider}. This implementation
* can be used when no logging is requested. * can be used when no logging is requested.
*/ */
public static EventProvider createEmptyEventProvider() { static EventProvider createEmptyEventProvider() {
return new EmptyEventProvider(); return new EmptyEventProvider();
} }
/** /**
* Creates and returns an empty implementation for {@link CompilationEvent}. * Creates and returns an empty implementation for {@link CompilationEvent}.
*/ */
public static CompilationEvent createEmptyCompilationEvent() { static CompilationEvent createEmptyCompilationEvent() {
return new EmptyCompilationEvent(); return new EmptyCompilationEvent();
} }
/** /**
* Creates and returns an empty implementation for {@link CompilationEvent}. * Creates and returns an empty implementation for {@link CompilationEvent}.
*/ */
public static CompilerFailureEvent createEmptyCompilerFailureEvent() { static CompilerFailureEvent createEmptyCompilerFailureEvent() {
return new EmptyCompilerFailureEvent(); return new EmptyCompilerFailureEvent();
} }

View File

@ -26,8 +26,10 @@ import jdk.vm.ci.code.CompilationRequest;
import jdk.vm.ci.common.JVMCIError; import jdk.vm.ci.common.JVMCIError;
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option; import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
import jdk.vm.ci.runtime.JVMCICompiler; import jdk.vm.ci.runtime.JVMCICompiler;
import jdk.vm.ci.runtime.JVMCICompilerFactory;
import jdk.vm.ci.runtime.JVMCIRuntime; import jdk.vm.ci.runtime.JVMCIRuntime;
import jdk.vm.ci.runtime.services.JVMCICompilerFactory; import jdk.vm.ci.services.JVMCIServiceLocator;
import jdk.vm.ci.services.JVMCIPermission;
import jdk.vm.ci.services.Services; import jdk.vm.ci.services.Services;
final class HotSpotJVMCICompilerConfig { final class HotSpotJVMCICompilerConfig {
@ -37,7 +39,7 @@ final class HotSpotJVMCICompilerConfig {
* to perform a compilation. This allows the reflective parts of the JVMCI API to be used * to perform a compilation. This allows the reflective parts of the JVMCI API to be used
* without requiring a compiler implementation to be available. * without requiring a compiler implementation to be available.
*/ */
private static class DummyCompilerFactory extends JVMCICompilerFactory implements JVMCICompiler { private static class DummyCompilerFactory implements JVMCICompilerFactory, JVMCICompiler {
public HotSpotCompilationRequestResult compileMethod(CompilationRequest request) { public HotSpotCompilationRequestResult compileMethod(CompilationRequest request) {
throw new JVMCIError("no JVMCI compiler selected"); throw new JVMCIError("no JVMCI compiler selected");
@ -63,15 +65,16 @@ final class HotSpotJVMCICompilerConfig {
* Gets the selected system compiler factory. * Gets the selected system compiler factory.
* *
* @return the selected system compiler factory * @return the selected system compiler factory
* @throws SecurityException if a security manager is present and it denies
* {@link JVMCIPermission} for any {@link JVMCIServiceLocator} loaded by this method
*/ */
static JVMCICompilerFactory getCompilerFactory() { static JVMCICompilerFactory getCompilerFactory() {
if (compilerFactory == null) { if (compilerFactory == null) {
JVMCICompilerFactory factory = null; JVMCICompilerFactory factory = null;
String compilerName = Option.Compiler.getString(); String compilerName = Option.Compiler.getString();
if (compilerName != null) { if (compilerName != null) {
for (JVMCICompilerFactory f : Services.load(JVMCICompilerFactory.class)) { for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) {
if (f.getCompilerName().equals(compilerName)) { if (f.getCompilerName().equals(compilerName)) {
Services.exportJVMCITo(f.getClass());
factory = f; factory = f;
} }
} }
@ -80,7 +83,7 @@ final class HotSpotJVMCICompilerConfig {
} }
} else { } else {
// Auto select a single available compiler // Auto select a single available compiler
for (JVMCICompilerFactory f : Services.load(JVMCICompilerFactory.class)) { for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) {
if (factory == null) { if (factory == null) {
Services.exportJVMCITo(f.getClass()); Services.exportJVMCITo(f.getClass());
factory = f; factory = f;

View File

@ -20,14 +20,14 @@
* or visit www.oracle.com if you need additional information or have any * or visit www.oracle.com if you need additional information or have any
* questions. * questions.
*/ */
package jdk.vm.ci.hotspot.services; package jdk.vm.ci.hotspot;
import jdk.vm.ci.runtime.services.JVMCICompilerFactory; import jdk.vm.ci.runtime.JVMCICompilerFactory;
/** /**
* HotSpot extensions to {@link JVMCICompilerFactory}. * HotSpot extensions to {@link JVMCICompilerFactory}.
*/ */
public abstract class HotSpotJVMCICompilerFactory extends JVMCICompilerFactory { public abstract class HotSpotJVMCICompilerFactory implements JVMCICompilerFactory {
/** /**
* Gets 0 or more prefixes identifying classes that should by compiled by C1 in simple mode * Gets 0 or more prefixes identifying classes that should by compiled by C1 in simple mode

View File

@ -27,13 +27,11 @@ import static jdk.vm.ci.common.InitTimer.timer;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.ServiceLoader;
import java.util.TreeMap; import java.util.TreeMap;
import jdk.internal.misc.VM; import jdk.internal.misc.VM;
@ -43,16 +41,15 @@ import jdk.vm.ci.code.CompiledCode;
import jdk.vm.ci.code.InstalledCode; import jdk.vm.ci.code.InstalledCode;
import jdk.vm.ci.common.InitTimer; import jdk.vm.ci.common.InitTimer;
import jdk.vm.ci.common.JVMCIError; import jdk.vm.ci.common.JVMCIError;
import jdk.vm.ci.hotspot.services.HotSpotJVMCICompilerFactory; import jdk.vm.ci.hotspot.HotSpotJVMCICompilerFactory.CompilationLevel;
import jdk.vm.ci.hotspot.services.HotSpotJVMCICompilerFactory.CompilationLevel;
import jdk.vm.ci.hotspot.services.HotSpotVMEventListener;
import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.JavaType;
import jdk.vm.ci.meta.ResolvedJavaType; import jdk.vm.ci.meta.ResolvedJavaType;
import jdk.vm.ci.runtime.JVMCI; import jdk.vm.ci.runtime.JVMCI;
import jdk.vm.ci.runtime.JVMCIBackend; import jdk.vm.ci.runtime.JVMCIBackend;
import jdk.vm.ci.runtime.JVMCICompiler; import jdk.vm.ci.runtime.JVMCICompiler;
import jdk.vm.ci.runtime.services.JVMCICompilerFactory; import jdk.vm.ci.runtime.JVMCICompilerFactory;
import jdk.vm.ci.services.JVMCIServiceLocator;
import jdk.vm.ci.services.Services; import jdk.vm.ci.services.Services;
/** /**
@ -246,11 +243,7 @@ public final class HotSpotJVMCIRuntime implements HotSpotJVMCIRuntimeProvider {
if (vmEventListeners == null) { if (vmEventListeners == null) {
synchronized (this) { synchronized (this) {
if (vmEventListeners == null) { if (vmEventListeners == null) {
List<HotSpotVMEventListener> listeners = new ArrayList<>(); vmEventListeners = JVMCIServiceLocator.getProviders(HotSpotVMEventListener.class);
for (HotSpotVMEventListener vmEventListener : ServiceLoader.load(HotSpotVMEventListener.class)) {
listeners.add(vmEventListener);
}
vmEventListeners = listeners;
} }
} }
} }

View File

@ -20,59 +20,35 @@
* or visit www.oracle.com if you need additional information or have any * or visit www.oracle.com if you need additional information or have any
* questions. * questions.
*/ */
package jdk.vm.ci.hotspot.services; package jdk.vm.ci.hotspot;
import jdk.vm.ci.code.CompiledCode; import jdk.vm.ci.code.CompiledCode;
import jdk.vm.ci.code.InstalledCode; import jdk.vm.ci.code.InstalledCode;
import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
import jdk.vm.ci.services.JVMCIPermission;
/** /**
* Service-provider class for responding to VM events. * Listener for responding to VM events.
*/ */
public abstract class HotSpotVMEventListener { public interface HotSpotVMEventListener {
private static Void checkPermission() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new JVMCIPermission());
}
return null;
}
@SuppressWarnings("unused")
HotSpotVMEventListener(Void ignore) {
}
/**
* Initializes a new instance of this class.
*
* @throws SecurityException if a security manager has been installed and it denies
* {@link JVMCIPermission}
*/
protected HotSpotVMEventListener() {
this(checkPermission());
}
/** /**
* Notifies this client that the VM is shutting down. * Notifies this client that the VM is shutting down.
*/ */
public void notifyShutdown() { default void notifyShutdown() {
} }
/** /**
* Notify on successful install into the code cache. * Notify on successful install into the code cache.
* *
* @param hotSpotCodeCacheProvider * @param hotSpotCodeCacheProvider the code cache into which the code was installed
* @param installedCode * @param installedCode the code that was installed
* @param compiledCode * @param compiledCode the compiled code from which {@code installedCode} was produced
*/ */
public void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider, InstalledCode installedCode, CompiledCode compiledCode) { default void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider, InstalledCode installedCode, CompiledCode compiledCode) {
} }
/** /**
* Notify on completion of a bootstrap. * Notify on completion of a bootstrap.
*/ */
public void notifyBootstrapFinished() { default void notifyBootstrapFinished() {
} }
} }

View File

@ -20,64 +20,38 @@
* or visit www.oracle.com if you need additional information or have any * or visit www.oracle.com if you need additional information or have any
* questions. * questions.
*/ */
package jdk.vm.ci.runtime.services; package jdk.vm.ci.runtime;
import java.io.PrintStream; import java.io.PrintStream;
import jdk.vm.ci.runtime.JVMCICompiler;
import jdk.vm.ci.runtime.JVMCIRuntime;
import jdk.vm.ci.services.JVMCIPermission;
/** /**
* Service-provider class for creating JVMCI compilers. * Factory for creating JVMCI compilers.
*/ */
public abstract class JVMCICompilerFactory { public interface JVMCICompilerFactory {
private static Void checkPermission() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new JVMCIPermission());
}
return null;
}
@SuppressWarnings("unused")
private JVMCICompilerFactory(Void ignore) {
}
/**
* Initializes a new instance of this class.
*
* @throws SecurityException if a security manager has been installed and it denies
* {@link JVMCIPermission}
*/
protected JVMCICompilerFactory() {
this(checkPermission());
}
/** /**
* Get the name of this compiler. The name is used by JVMCI to determine which factory to use. * Get the name of this compiler. The name is used by JVMCI to determine which factory to use.
*/ */
public abstract String getCompilerName(); String getCompilerName();
/** /**
* Notifies this object that it has been selected to {@linkplain #createCompiler(JVMCIRuntime) * Notifies this object that it has been selected to {@linkplain #createCompiler(JVMCIRuntime)
* create} a compiler and it should now perform any heavy weight initialization that it deferred * create} a compiler and it should now perform any heavy weight initialization that it deferred
* during construction. * during construction.
*/ */
public void onSelection() { default void onSelection() {
} }
/** /**
* Create a new instance of a {@link JVMCICompiler}. * Create a new instance of a {@link JVMCICompiler}.
*/ */
public abstract JVMCICompiler createCompiler(JVMCIRuntime runtime); JVMCICompiler createCompiler(JVMCIRuntime runtime);
/** /**
* Prints a description of the properties used to configure this compiler. * Prints a description of the properties used to configure this compiler.
* *
* @param out where to print the message * @param out where to print the message
*/ */
public void printProperties(PrintStream out) { default void printProperties(PrintStream out) {
} }
} }

View File

@ -0,0 +1,83 @@
/*
* Copyright (c) 2016, 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.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.vm.ci.services;
import java.util.ArrayList;
import java.util.List;
/**
* Service-provider class for the runtime to locate providers of JVMCI services where the latter are
* not in packages exported by the JVMCI module. As part of instantiating
* {@link JVMCIServiceLocator}, all JVMCI packages will be {@linkplain Services#exportJVMCITo(Class)
* exported} to the module defining the class of the instantiated object.
*
* While the {@link #getProvider(Class)} method can be used directly, it's usually easier to use
* {@link #getProviders(Class)}.
*/
public abstract class JVMCIServiceLocator {
private static Void checkPermission() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new JVMCIPermission());
}
return null;
}
@SuppressWarnings("unused")
private JVMCIServiceLocator(Void ignore) {
}
/**
* Creates a capability for accessing JVMCI. Once successfully instantiated, JVMCI exports all
* its packages to the module defining the type of this object.
*
* @throws SecurityException if a security manager has been installed and it denies
* {@link JVMCIPermission}
*/
protected JVMCIServiceLocator() {
this(checkPermission());
Services.exportJVMCITo(getClass());
}
/**
* Gets the provider of the service defined by {@code service} or {@code null} if this object
* does not have a provider for {@code service}.
*/
public abstract <S> S getProvider(Class<S> service);
/**
* Gets the providers of the service defined by {@code service} by querying the
* {@link JVMCIServiceLocator} providers obtained by {@link Services#load(Class)}.
*/
public static <S> List<S> getProviders(Class<S> service) {
List<S> providers = new ArrayList<>();
for (JVMCIServiceLocator access : Services.load(JVMCIServiceLocator.class)) {
S provider = access.getProvider(service);
if (provider != null) {
providers.add(provider);
}
}
return providers;
}
}

View File

@ -25,12 +25,9 @@
module jdk.vm.ci { module jdk.vm.ci {
exports jdk.vm.ci.services; exports jdk.vm.ci.services;
exports jdk.vm.ci.runtime.services;
exports jdk.vm.ci.hotspot.services;
uses jdk.vm.ci.hotspot.services.HotSpotVMEventListener; uses jdk.vm.ci.services.JVMCIServiceLocator;
uses jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory; uses jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory;
uses jdk.vm.ci.runtime.services.JVMCICompilerFactory;
provides jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory with provides jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory with
jdk.vm.ci.hotspot.aarch64.AArch64HotSpotJVMCIBackendFactory; jdk.vm.ci.hotspot.aarch64.AArch64HotSpotJVMCIBackendFactory;

View File

@ -25,17 +25,29 @@ package compiler.jvmci.common;
import jdk.vm.ci.code.CompilationRequest; import jdk.vm.ci.code.CompilationRequest;
import jdk.vm.ci.code.CompilationRequestResult; import jdk.vm.ci.code.CompilationRequestResult;
import jdk.vm.ci.hotspot.services.HotSpotVMEventListener; import jdk.vm.ci.hotspot.HotSpotVMEventListener;
import jdk.vm.ci.services.JVMCIServiceLocator;
import jdk.vm.ci.runtime.JVMCICompiler; import jdk.vm.ci.runtime.JVMCICompiler;
import jdk.vm.ci.runtime.JVMCIRuntime; import jdk.vm.ci.runtime.JVMCIRuntime;
import jdk.vm.ci.runtime.services.JVMCICompilerFactory; import jdk.vm.ci.runtime.JVMCICompilerFactory;
/* /*
* A stub classes to be able to use jvmci * A stub classes to be able to use jvmci
*/ */
public class JVMCIHelpers { public class JVMCIHelpers extends JVMCIServiceLocator {
public static class EmptyVMEventListener extends HotSpotVMEventListener { @Override
public <S> S getProvider(Class<S> service) {
if (service == JVMCICompilerFactory.class) {
return service.cast(new EmptyCompilerFactory());
}
if (service == HotSpotVMEventListener.class) {
return service.cast(new EmptyVMEventListener());
}
return null;
}
public static class EmptyVMEventListener implements HotSpotVMEventListener {
// just empty, using default interface methods // just empty, using default interface methods
} }
@ -54,7 +66,7 @@ public class JVMCIHelpers {
} }
} }
public static class EmptyCompilerFactory extends JVMCICompilerFactory { public static class EmptyCompilerFactory implements JVMCICompilerFactory {
@Override @Override
public String getCompilerName() { public String getCompilerName() {

View File

@ -1 +0,0 @@
compiler.jvmci.common.JVMCIHelpers$EmptyVMEventListener

View File

@ -1 +0,0 @@
compiler.jvmci.common.JVMCIHelpers$EmptyHotspotCompiler

View File

@ -1 +0,0 @@
compiler.jvmci.common.JVMCIHelpers$EmptyCompilerFactory

View File

@ -1 +1,2 @@
compiler.jvmci.events.JvmciNotifyBootstrapFinishedEventTest compiler.jvmci.events.JvmciNotifyBootstrapFinishedEventTest
compiler.jvmci.common.JVMCIHelpers

View File

@ -37,9 +37,8 @@
* *
* @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @build compiler.jvmci.common.JVMCIHelpers * @build compiler.jvmci.common.JVMCIHelpers
* @run driver jdk.test.lib.FileInstaller ../common/services/ ./META-INF/services/
* @run driver jdk.test.lib.FileInstaller ./JvmciNotifyBootstrapFinishedEventTest.config * @run driver jdk.test.lib.FileInstaller ./JvmciNotifyBootstrapFinishedEventTest.config
* ./META-INF/services/jdk.vm.ci.hotspot.services.HotSpotVMEventListener * ./META-INF/services/jdk.vm.ci.services.JVMCIServiceLocator
* @run driver ClassFileInstaller * @run driver ClassFileInstaller
* compiler.jvmci.common.JVMCIHelpers$EmptyHotspotCompiler * compiler.jvmci.common.JVMCIHelpers$EmptyHotspotCompiler
* compiler.jvmci.common.JVMCIHelpers$EmptyCompilerFactory * compiler.jvmci.common.JVMCIHelpers$EmptyCompilerFactory
@ -60,9 +59,10 @@
package compiler.jvmci.events; package compiler.jvmci.events;
import jdk.test.lib.Asserts; import jdk.test.lib.Asserts;
import jdk.vm.ci.hotspot.services.HotSpotVMEventListener; import jdk.vm.ci.services.JVMCIServiceLocator;
import jdk.vm.ci.hotspot.HotSpotVMEventListener;
public class JvmciNotifyBootstrapFinishedEventTest extends HotSpotVMEventListener { public class JvmciNotifyBootstrapFinishedEventTest extends JVMCIServiceLocator implements HotSpotVMEventListener {
private static final boolean BOOTSTRAP = Boolean private static final boolean BOOTSTRAP = Boolean
.getBoolean("compiler.jvmci.events.JvmciNotifyBootstrapFinishedEventTest.bootstrap"); .getBoolean("compiler.jvmci.events.JvmciNotifyBootstrapFinishedEventTest.bootstrap");
private static volatile int gotBoostrapNotification = 0; private static volatile int gotBoostrapNotification = 0;
@ -75,6 +75,14 @@ public class JvmciNotifyBootstrapFinishedEventTest extends HotSpotVMEventListene
} }
} }
@Override
public <S> S getProvider(Class<S> service) {
if (service == HotSpotVMEventListener.class) {
return service.cast(this);
}
return null;
}
@Override @Override
public void notifyBootstrapFinished() { public void notifyBootstrapFinished() {
gotBoostrapNotification++; gotBoostrapNotification++;

View File

@ -1 +1,2 @@
compiler.jvmci.events.JvmciNotifyInstallEventTest compiler.jvmci.events.JvmciNotifyInstallEventTest
compiler.jvmci.common.JVMCIHelpers

View File

@ -38,9 +38,8 @@
* *
* @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @build compiler.jvmci.common.JVMCIHelpers * @build compiler.jvmci.common.JVMCIHelpers
* @run driver jdk.test.lib.FileInstaller ../common/services/ ./META-INF/services/
* @run driver jdk.test.lib.FileInstaller ./JvmciNotifyInstallEventTest.config * @run driver jdk.test.lib.FileInstaller ./JvmciNotifyInstallEventTest.config
* ./META-INF/services/jdk.vm.ci.hotspot.services.HotSpotVMEventListener * ./META-INF/services/jdk.vm.ci.services.JVMCIServiceLocator
* @run driver ClassFileInstaller * @run driver ClassFileInstaller
* compiler.jvmci.common.JVMCIHelpers$EmptyHotspotCompiler * compiler.jvmci.common.JVMCIHelpers$EmptyHotspotCompiler
* compiler.jvmci.common.JVMCIHelpers$EmptyCompilerFactory * compiler.jvmci.common.JVMCIHelpers$EmptyCompilerFactory
@ -73,6 +72,7 @@ import compiler.jvmci.common.CTVMUtilities;
import compiler.jvmci.common.testcases.SimpleClass; import compiler.jvmci.common.testcases.SimpleClass;
import jdk.test.lib.Asserts; import jdk.test.lib.Asserts;
import jdk.test.lib.Utils; import jdk.test.lib.Utils;
import jdk.vm.ci.services.JVMCIServiceLocator;
import jdk.vm.ci.code.CompiledCode; import jdk.vm.ci.code.CompiledCode;
import jdk.vm.ci.code.InstalledCode; import jdk.vm.ci.code.InstalledCode;
import jdk.vm.ci.code.site.DataPatch; import jdk.vm.ci.code.site.DataPatch;
@ -82,13 +82,13 @@ import jdk.vm.ci.hotspot.HotSpotCompiledCode;
import jdk.vm.ci.hotspot.HotSpotCompiledCode.Comment; import jdk.vm.ci.hotspot.HotSpotCompiledCode.Comment;
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod; import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
import jdk.vm.ci.hotspot.services.HotSpotVMEventListener; import jdk.vm.ci.hotspot.HotSpotVMEventListener;
import jdk.vm.ci.meta.Assumptions.Assumption; import jdk.vm.ci.meta.Assumptions.Assumption;
import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaMethod;
import java.lang.reflect.Method; import java.lang.reflect.Method;
public class JvmciNotifyInstallEventTest extends HotSpotVMEventListener { public class JvmciNotifyInstallEventTest extends JVMCIServiceLocator implements HotSpotVMEventListener {
private static final String METHOD_NAME = "testMethod"; private static final String METHOD_NAME = "testMethod";
private static final boolean FAIL_ON_INIT = !Boolean.getBoolean( private static final boolean FAIL_ON_INIT = !Boolean.getBoolean(
"compiler.jvmci.events.JvmciNotifyInstallEventTest.failoninit"); "compiler.jvmci.events.JvmciNotifyInstallEventTest.failoninit");
@ -98,6 +98,14 @@ public class JvmciNotifyInstallEventTest extends HotSpotVMEventListener {
new JvmciNotifyInstallEventTest().runTest(); new JvmciNotifyInstallEventTest().runTest();
} }
@Override
public <S> S getProvider(Class<S> service) {
if (service == HotSpotVMEventListener.class) {
return service.cast(this);
}
return null;
}
private void runTest() { private void runTest() {
if (gotInstallNotification != 0) { if (gotInstallNotification != 0) {
throw new Error("Got install notification before test actions"); throw new Error("Got install notification before test actions");

View File

@ -23,10 +23,11 @@
package compiler.jvmci.events; package compiler.jvmci.events;
import jdk.vm.ci.services.JVMCIServiceLocator;
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
import jdk.vm.ci.hotspot.services.HotSpotVMEventListener; import jdk.vm.ci.hotspot.HotSpotVMEventListener;
public class JvmciShutdownEventListener extends HotSpotVMEventListener { public class JvmciShutdownEventListener extends JVMCIServiceLocator implements HotSpotVMEventListener {
public static final String MESSAGE = "Shutdown notified"; public static final String MESSAGE = "Shutdown notified";
public static final String GOT_INTERNAL_ERROR = "Got internal error"; public static final String GOT_INTERNAL_ERROR = "Got internal error";
@ -38,6 +39,14 @@ public class JvmciShutdownEventListener extends HotSpotVMEventListener {
} }
} }
@Override
public <S> S getProvider(Class<S> service) {
if (service == HotSpotVMEventListener.class) {
return service.cast(this);
}
return null;
}
@Override @Override
public void notifyShutdown() { public void notifyShutdown() {
System.out.println(MESSAGE); System.out.println(MESSAGE);

View File

@ -1 +1,2 @@
compiler.jvmci.events.JvmciShutdownEventListener compiler.jvmci.events.JvmciShutdownEventListener
compiler.jvmci.common.JVMCIHelpers

View File

@ -34,9 +34,8 @@
* *
* @build compiler.jvmci.common.JVMCIHelpers * @build compiler.jvmci.common.JVMCIHelpers
* compiler.jvmci.events.JvmciShutdownEventListener * compiler.jvmci.events.JvmciShutdownEventListener
* @run driver jdk.test.lib.FileInstaller ../common/services/ ./META-INF/services/
* @run driver jdk.test.lib.FileInstaller ./JvmciShutdownEventTest.config * @run driver jdk.test.lib.FileInstaller ./JvmciShutdownEventTest.config
* ./META-INF/services/jdk.vm.ci.hotspot.services.HotSpotVMEventListener * ./META-INF/services/jdk.vm.ci.services.JVMCIServiceLocator
* @run driver ClassFileInstaller * @run driver ClassFileInstaller
* compiler.jvmci.common.JVMCIHelpers$EmptyHotspotCompiler * compiler.jvmci.common.JVMCIHelpers$EmptyHotspotCompiler
* compiler.jvmci.common.JVMCIHelpers$EmptyCompilerFactory * compiler.jvmci.common.JVMCIHelpers$EmptyCompilerFactory