src/jdk.internal.vm.compiler/share/classes/jdk.internal.vm.compiler.libgraal/src/jdk/internal/vm/compiler/libgraal/LibGraal.java
--- a/src/jdk.internal.vm.compiler/share/classes/jdk.internal.vm.compiler.libgraal/src/jdk/internal/vm/compiler/libgraal/LibGraal.java Thu Jun 27 03:10:52 2019 +0200
+++ b/src/jdk.internal.vm.compiler/share/classes/jdk.internal.vm.compiler.libgraal/src/jdk/internal/vm/compiler/libgraal/LibGraal.java Thu Jun 27 03:33:44 2019 +0200
@@ -33,67 +33,43 @@
public class LibGraal {
public static boolean isAvailable() {
- return isCurrentRuntime() || libgraalIsolate != 0L;
+ return inLibGraal() || isolate != 0L;
}
- public static boolean isCurrentRuntime() {
+ public static boolean inLibGraal() {
return Services.IS_IN_NATIVE_IMAGE;
}
- public static long getIsolate() {
- if (isCurrentRuntime() || !isAvailable()) {
- throw new IllegalStateException();
- }
- return libgraalIsolate;
- }
-
- public static long getIsolateThread() {
- if (isCurrentRuntime()) {
- throw new IllegalStateException();
- }
- return CURRENT_ISOLATE_THREAD.get();
- }
-
- @SuppressWarnings("unused")
- public static long[] registerNativeMethods(HotSpotJVMCIRuntime runtime, Class<?> clazz) {
+ public static void registerNativeMethods(HotSpotJVMCIRuntime runtime, Class<?> clazz) {
if (clazz.isPrimitive()) {
throw new IllegalArgumentException();
}
- if (isCurrentRuntime() || !isAvailable()) {
+ if (inLibGraal() || !isAvailable()) {
throw new IllegalStateException();
}
- // Waiting for https://bugs.openjdk.java.net/browse/JDK-8220623
- // return runtime.registerNativeMethods(clazz);
- throw new IllegalStateException("Requires JDK-8220623");
+ runtime.registerNativeMethods(clazz);
}
- @SuppressWarnings("unused")
public static long translate(HotSpotJVMCIRuntime runtime, Object obj) {
if (!isAvailable()) {
throw new IllegalStateException();
}
- // return runtime.translate(obj);
- throw new IllegalStateException("Requires JDK-8220623");
+ if (!inLibGraal() && LibGraalScope.currentScope.get() == null) {
+ throw new IllegalStateException("Not within a " + LibGraalScope.class.getName());
+ }
+ return runtime.translate(obj);
}
- @SuppressWarnings("unused")
public static <T> T unhand(HotSpotJVMCIRuntime runtime, Class<T> type, long handle) {
if (!isAvailable()) {
throw new IllegalStateException();
}
- // return runtime.unhand(type, handle);
- throw new IllegalStateException("Requires JDK-8220623");
+ if (!inLibGraal() && LibGraalScope.currentScope.get() == null) {
+ throw new IllegalStateException("Not within a " + LibGraalScope.class.getName());
+ }
+ return runtime.unhand(type, handle);
}
- private static final ThreadLocal<Long> CURRENT_ISOLATE_THREAD = new ThreadLocal<>() {
- @Override
- protected Long initialValue() {
- return attachThread(libgraalIsolate);
- }
- };
-
- private static final long libgraalIsolate = Services.IS_BUILDING_NATIVE_IMAGE ? 0L : initializeLibgraal();
-
private static long initializeLibgraal() {
try {
// Initialize JVMCI to ensure JVMCI opens its packages to
@@ -101,20 +77,27 @@
// below will fail on JDK13+.
Services.initializeJVMCI();
- // Waiting for https://bugs.openjdk.java.net/browse/JDK-8220623
- // HotSpotJVMCIRuntime runtime = HotSpotJVMCIRuntime.runtime();
- // long[] nativeInterface = runtime.registerNativeMethods(LibGraal.class);
- // return nativeInterface[1];
- return 0L;
+ HotSpotJVMCIRuntime runtime = HotSpotJVMCIRuntime.runtime();
+ long[] nativeInterface = runtime.registerNativeMethods(LibGraal.class);
+ return nativeInterface[1];
} catch (UnsupportedOperationException e) {
return 0L;
}
}
- /**
- * Attaches the current thread to a thread in {@code isolate}.
- *
- * @param isolate
- */
- private static native long attachThread(long isolate);
+ static final long isolate = Services.IS_BUILDING_NATIVE_IMAGE ? 0L : initializeLibgraal();
+
+ static boolean isCurrentThreadAttached(HotSpotJVMCIRuntime runtime) {
+ return runtime.isCurrentThreadAttached();
+ }
+
+ static boolean attachCurrentThread(HotSpotJVMCIRuntime runtime) {
+ return runtime.attachCurrentThread(false);
+ }
+
+ static void detachCurrentThread(HotSpotJVMCIRuntime runtime) {
+ runtime.detachCurrentThread();
+ }
+
+ static native long getCurrentIsolateThread(long iso);
}