From ea6220b6857bfee3a867453355b4da2cb98c4b7e Mon Sep 17 00:00:00 2001 From: Robert Toyonaga Date: Mon, 4 Jul 2022 12:13:46 -0400 Subject: [PATCH 1/8] testing --- .../oracle/svm/core/monitor/MultiThreadedMonitorSupport.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java index 1a32abacb6e7..9d1d629af958 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java @@ -578,6 +578,11 @@ final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer { final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionObject { /** Enclosing {@link AbstractQueuedSynchronizer} of this nested class. */ @Alias Target_java_util_concurrent_locks_AbstractQueuedSynchronizer this$0; + + @com.oracle.svm.core.annotate.Substitute + private void reportInterruptAfterWait(int interruptMode) { + //test + } } @TargetClass(value = ReferenceQueue.class, innerClass = "Lock") From 0ca9da3f89b6fd1e56330ad578cec9498a12daa0 Mon Sep 17 00:00:00 2001 From: Robert Toyonaga Date: Mon, 4 Jul 2022 12:22:12 -0400 Subject: [PATCH 2/8] works --- .../svm/core/monitor/MultiThreadedMonitorSupport.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java index 9d1d629af958..666ea14b3cc1 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java @@ -579,10 +579,13 @@ final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Conditi /** Enclosing {@link AbstractQueuedSynchronizer} of this nested class. */ @Alias Target_java_util_concurrent_locks_AbstractQueuedSynchronizer this$0; - @com.oracle.svm.core.annotate.Substitute - private void reportInterruptAfterWait(int interruptMode) { - //test - } + @Alias + public native final void signal(); +// @com.oracle.svm.core.annotate.Delete +// private void reportInterruptAfterWait(int interruptMode) throws InterruptedException{ +// //test +// } + } @TargetClass(value = ReferenceQueue.class, innerClass = "Lock") From 2b14153d4f8140ef3268b793b07f8a09ca5dfcb4 Mon Sep 17 00:00:00 2001 From: Robert Toyonaga Date: Mon, 4 Jul 2022 14:15:46 -0400 Subject: [PATCH 3/8] add substitutions for jdk 17 --- .../jdk/Target_java_util_ServiceLoader.java | 2 +- .../monitor/MultiThreadedMonitorSupport.java | 91 +++++++++++++++++-- ...locks_AbstractQueuedSynchronizer_Node.java | 25 +++++ .../core/thread/Target_java_lang_Thread.java | 3 + .../AnnotationSubstitutionProcessor.java | 14 ++- 5 files changed, 123 insertions(+), 12 deletions(-) create mode 100644 substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.java diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_java_util_ServiceLoader.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_java_util_ServiceLoader.java index 2079b7c4ea88..ff885dc8950f 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_java_util_ServiceLoader.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_java_util_ServiceLoader.java @@ -132,7 +132,7 @@ private boolean hasNextService() { } catch (ServiceConfigurationError e) { nextError = e; } - } + } return true; } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java index 666ea14b3cc1..82eff9b73015 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java @@ -30,12 +30,8 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.AbstractOwnableSynchronizer; -import java.util.concurrent.locks.AbstractQueuedSynchronizer; +import java.util.concurrent.locks.*; import java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.LockSupport; -import java.util.concurrent.locks.ReentrantLock; import org.graalvm.compiler.core.common.SuppressFBWarnings; import org.graalvm.compiler.serviceprovider.JavaVersionUtil; @@ -47,6 +43,7 @@ import com.oracle.svm.core.WeakIdentityHashMap; import com.oracle.svm.core.annotate.Alias; import com.oracle.svm.core.annotate.Inject; +import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.RecomputeFieldValue; import com.oracle.svm.core.annotate.RestrictHeapAccess; import com.oracle.svm.core.annotate.RestrictHeapAccess.Access; @@ -375,6 +372,9 @@ protected void doWait(Object obj, long timeoutMillis) throws InterruptedExceptio Condition condition = getOrCreateCondition(lock, true); if (timeoutMillis == 0L) { condition.await(); + com.oracle.svm.core.thread.Target_java_lang_Thread t = SubstrateUtil.cast(Thread.currentThread(), com.oracle.svm.core.thread.Target_java_lang_Thread.class); + + System.out.println("notifier id is: "+ t.notifierTid); } else { condition.await(timeoutMillis, TimeUnit.MILLISECONDS); } @@ -566,12 +566,31 @@ final class Target_com_oracle_svm_core_monitor_MultiThreadedMonitorSupport { final class Target_java_util_concurrent_locks_ReentrantLock { @Alias// Target_java_util_concurrent_locks_ReentrantLock_Sync sync; + } + @TargetClass(AbstractQueuedSynchronizer.class) final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer { @Alias // volatile int state; + @Alias + final native void enqueue(Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node node); +} +@com.oracle.svm.core.annotate.TargetClass(value = java.util.concurrent.locks.AbstractQueuedSynchronizer.class, innerClass = "Node") +final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node { + @Alias + Thread waiter; + @Alias + final native int getAndUnsetStatus(int v); +} + +@com.oracle.svm.core.annotate.TargetClass(value = java.util.concurrent.locks.AbstractQueuedSynchronizer.class, innerClass = "ConditionNode") +final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode { + + @Alias + Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode nextWaiter; + } @TargetClass(value = ConditionObject.class) @@ -580,14 +599,68 @@ final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Conditi @Alias Target_java_util_concurrent_locks_AbstractQueuedSynchronizer this$0; @Alias - public native final void signal(); -// @com.oracle.svm.core.annotate.Delete -// private void reportInterruptAfterWait(int interruptMode) throws InterruptedException{ -// //test + private transient Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode firstWaiter; + @Alias + private transient Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode lastWaiter; + +// @Substitute +// public final void signal() { +// Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode first = this.firstWaiter; +// if (first != null) { +// System.out.println(Thread.currentThread().getId()); +// Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node firstNode = SubstrateUtil.cast(first, Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.class); +// com.oracle.svm.core.thread.Target_java_lang_Thread t = SubstrateUtil.cast(firstNode.waiter, com.oracle.svm.core.thread.Target_java_lang_Thread.class); +// t.notifierTid = Thread.currentThread().getId(); +// this.doSignal(first, false); +// } // } +// +// public final void signalAll() { +// Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode first = this.firstWaiter; +// if (first != null) { +// System.out.println(Thread.currentThread().getId()); +// Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node firstNode = SubstrateUtil.cast(first, Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.class); +// com.oracle.svm.core.thread.Target_java_lang_Thread t = SubstrateUtil.cast(firstNode.waiter, com.oracle.svm.core.thread.Target_java_lang_Thread.class); +// t.notifierTid = Thread.currentThread().getId(); +// this.doSignal(first, true); +// } +// } + @Substitute + private void doSignal(Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode first, boolean all) { + while(true) { + Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode next; + label19: { + if (first != null) { + next = first.nextWaiter; + if ((this.firstWaiter = next) == null) { + this.lastWaiter = null; + } + Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node firstNode = SubstrateUtil.cast(first, Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.class); + if ((firstNode.getAndUnsetStatus(2) & 2) == 0) { + break label19; + } + + System.out.println(Thread.currentThread().getId()); + com.oracle.svm.core.thread.Target_java_lang_Thread t = SubstrateUtil.cast(firstNode.waiter, com.oracle.svm.core.thread.Target_java_lang_Thread.class); + t.notifierTid = Thread.currentThread().getId(); + + this$0.enqueue(firstNode); + if (all) { + break label19; + } + } + + return; + } + + first = next; + } + } } + + @TargetClass(value = ReferenceQueue.class, innerClass = "Lock") final class Target_java_lang_ref_ReferenceQueue_Lock { } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.java new file mode 100644 index 000000000000..21964d4a751e --- /dev/null +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.java @@ -0,0 +1,25 @@ +//package com.oracle.svm.core.monitor; +// +//import java.util.ArrayList; +//import java.util.concurrent.locks.AbstractQueuedSynchronizer; +// +//@com.oracle.svm.core.annotate.TargetClass(value = java.util.concurrent.locks.AbstractQueuedSynchronizer.class, onlyWith = com.oracle.svm.core.jfr.HasJfrSupport.class, innerClass = "Node") +//public final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node { +// @com.oracle.svm.core.annotate.Inject +//// @com.oracle.svm.core.annotate.RecomputeFieldValue(kind = com.oracle.svm.core.annotate.RecomputeFieldValue.Kind.NewInstance)// +// public long notifierId; +// +// @com.oracle.svm.core.annotate.Alias +// native boolean compareAndSetWaitStatus(int expect, int update); +// +// @com.oracle.svm.core.annotate.Alias +// static final int CONDITION = -2; //is this correct? +// @com.oracle.svm.core.annotate.Alias +// static final int SIGNAL = -1; +// +// @com.oracle.svm.core.annotate.Alias +// volatile int waitStatus; +// +// @com.oracle.svm.core.annotate.Alias +// volatile Thread thread; +//} \ No newline at end of file diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/Target_java_lang_Thread.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/Target_java_lang_Thread.java index 9e7e7778ab9e..6955d8cf7e29 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/Target_java_lang_Thread.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/Target_java_lang_Thread.java @@ -85,6 +85,9 @@ public final class Target_java_lang_Thread { @Inject @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset) // long parentThreadId; + @Inject @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset) // + public long notifierTid; + @Inject @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.NewInstance, declClass = ThreadData.class)// UnacquiredThreadData threadData; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java index 8a3aae68a486..063a96354464 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java @@ -786,12 +786,14 @@ private ResolvedJavaMethod findOriginalMethod(Executable annotatedMethod, Class< if (originalName.length() == 0) { originalName = annotatedMethod.getName(); } - + Class[] originalParams_ = null; + Method originalMethod_ = null; try { if (annotatedMethod instanceof Method && !originalName.equals(TargetElement.CONSTRUCTOR_NAME)) { Class[] originalParams = interceptParameterTypes(annotatedMethod.getParameterTypes()); + originalParams_ = originalParams; Method originalMethod = originalClass.getDeclaredMethod(originalName, originalParams); - + originalMethod_ = originalMethod; guarantee(Modifier.isStatic(annotatedMethod.getModifiers()) == Modifier.isStatic(originalMethod.getModifiers()), "Static modifier mismatch: %s, %s", annotatedMethod, originalMethod); return metaAccess.lookupJavaMethod(originalMethod); @@ -803,6 +805,14 @@ private ResolvedJavaMethod findOriginalMethod(Executable annotatedMethod, Class< } } catch (NoSuchMethodException ex) { + if ( originalParams_ !=null) { + System.out.println(originalParams_.toString()); + } + if ( originalMethod_ !=null) { + System.out.println(originalMethod_.toString()); + } + System.out.println(originalName); + System.out.println(originalClass.toString()); throw UserError.abort("Could not find target method: %s", annotatedMethod); } catch (LinkageError error) { throw UserError.abort("Cannot find %s.%s, %s can not be loaded, due to %s not being available in the classpath. Are you missing a dependency in your classpath?", From 78973a6b5f15c7a700d7712477ccf8084324bb73 Mon Sep 17 00:00:00 2001 From: Robert Toyonaga Date: Mon, 4 Jul 2022 15:19:34 -0400 Subject: [PATCH 4/8] add thread sleep events and refactor --- .../src/com/oracle/svm/core/jfr/JfrEvent.java | 4 +- .../com/oracle/svm/core/jfr/SubstrateJVM.java | 5 ++ .../core/jfr/events/ExecutionSampleEvent.java | 2 +- .../jfr/events/JavaMonitorEnterEvent.java | 6 +- .../core/jfr/events/JavaMonitorWaitEvent.java | 62 +++++++++++++++++++ .../svm/core/jfr/events/ThreadSleepEvent.java | 62 +++++++++++++++++++ .../svm/core/jfr/events/ThreadStartEvent.java | 2 +- .../monitor/MultiThreadedMonitorSupport.java | 35 +++-------- .../oracle/svm/core/thread/JavaThreads.java | 3 + 9 files changed, 150 insertions(+), 31 deletions(-) create mode 100644 substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorWaitEvent.java create mode 100644 substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadSleepEvent.java diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/JfrEvent.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/JfrEvent.java index d6bc9dc3ad1d..8a11b2c33a73 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/JfrEvent.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/JfrEvent.java @@ -54,7 +54,9 @@ public enum JfrEvent { SafepointBegin("jdk.SafepointBegin"), SafepointEnd("jdk.SafepointEnd"), ExecuteVMOperation("jdk.ExecuteVMOperation"), - JavaMonitorEnter("jdk.JavaMonitorEnter"); + JavaMonitorEnter("jdk.JavaMonitorEnter"), + ThreadSleep("jdk.ThreadSleep"), + JavaMonitorWait("jdk.JavaMonitorWait"); private final long id; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/SubstrateJVM.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/SubstrateJVM.java index a882f3db4be4..09275a450385 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/SubstrateJVM.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/SubstrateJVM.java @@ -254,6 +254,11 @@ public long getStackTraceId(int skipCount) { return stackTraceRepo.getStackTraceId(skipCount, false); } + @Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true) + public long getStackTraceId(JfrEvent eventType, int skipCount) { + return getStackTraceId(eventType.getId(), skipCount); + } + /** See {@link JVM#getThreadId}. */ public static long getThreadId(Thread thread) { if (HasJfrSupport.get()) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ExecutionSampleEvent.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ExecutionSampleEvent.java index a4c0cb673542..1f914beaacd4 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ExecutionSampleEvent.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ExecutionSampleEvent.java @@ -69,7 +69,7 @@ public static void writeExecutionSample(IsolateThread isolateThread, Thread.Stat JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.ExecutionSample); JfrNativeEventWriter.putLong(data, JfrTicks.elapsedTicks()); JfrNativeEventWriter.putThread(data, isolateThread); - JfrNativeEventWriter.putLong(data, svm.getStackTraceId(JfrEvent.ExecutionSample.getId(), 0)); + JfrNativeEventWriter.putLong(data, svm.getStackTraceId(JfrEvent.ExecutionSample, 0)); JfrNativeEventWriter.putLong(data, JfrThreadState.getId(threadState)); JfrNativeEventWriter.endSmallEvent(data); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorEnterEvent.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorEnterEvent.java index 20a6a81d9fd9..9fd5dd2af64b 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorEnterEvent.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorEnterEvent.java @@ -36,6 +36,8 @@ import com.oracle.svm.core.jfr.JfrNativeEventWriterDataAccess; import com.oracle.svm.core.jfr.JfrTicks; import com.oracle.svm.core.jfr.SubstrateJVM; +import org.graalvm.compiler.word.Word; + public class JavaMonitorEnterEvent { public static void emit(Object obj, long previousOwnerTid, long startTicks) { @@ -54,10 +56,10 @@ public static void emit0(Object obj, long previousOwnerTid, long startTicks) { JfrNativeEventWriter.putLong(data, startTicks); JfrNativeEventWriter.putLong(data, JfrTicks.elapsedTicks() - startTicks); JfrNativeEventWriter.putEventThread(data); - JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.JavaMonitorEnter.getId(), 0)); + JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.JavaMonitorEnter, 0)); JfrNativeEventWriter.putClass(data, obj.getClass()); JfrNativeEventWriter.putLong(data, previousOwnerTid); - JfrNativeEventWriter.putLong(data, org.graalvm.compiler.word.Word.objectToUntrackedPointer(obj).rawValue()); + JfrNativeEventWriter.putLong(data, Word.objectToUntrackedPointer(obj).rawValue()); JfrNativeEventWriter.endSmallEvent(data); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorWaitEvent.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorWaitEvent.java new file mode 100644 index 000000000000..f04625062e30 --- /dev/null +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorWaitEvent.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2022, Red Hat Inc. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 com.oracle.svm.core.jfr.events; +import com.oracle.svm.core.annotate.Uninterruptible; +import com.oracle.svm.core.jfr.JfrEvent; +import com.oracle.svm.core.jfr.JfrNativeEventWriter; +import com.oracle.svm.core.jfr.JfrNativeEventWriterData; +import com.oracle.svm.core.jfr.JfrNativeEventWriterDataAccess; +import com.oracle.svm.core.jfr.JfrTicks; +import com.oracle.svm.core.jfr.SubstrateJVM; +import org.graalvm.compiler.word.Word; +import com.oracle.svm.core.jfr.HasJfrSupport; +public class JavaMonitorWaitEvent { + public static void emit(long startTicks, Object obj, long notifier, long timeout, boolean timedOut) { + if (HasJfrSupport.get()) { + emit0(startTicks, obj, notifier, timeout, timedOut); + } + } + + @Uninterruptible(reason = "Accesses a JFR buffer.") + private static void emit0(long startTicks, Object obj, long notifier, long timeout, boolean timedOut) { + if (SubstrateJVM.isRecording() && SubstrateJVM.get().isEnabled(JfrEvent.JavaMonitorWait)) { + JfrNativeEventWriterData data = org.graalvm.nativeimage.StackValue.get(JfrNativeEventWriterData.class); + JfrNativeEventWriterDataAccess.initializeThreadLocalNativeBuffer(data); + JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.JavaMonitorWait); + JfrNativeEventWriter.putLong(data, startTicks); + JfrNativeEventWriter.putLong(data, JfrTicks.elapsedTicks() - startTicks); + JfrNativeEventWriter.putEventThread(data); + JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.JavaMonitorWait, 0)); + JfrNativeEventWriter.putClass(data, obj.getClass()); + JfrNativeEventWriter.putLong(data, notifier); + JfrNativeEventWriter.putLong(data, timeout); + JfrNativeEventWriter.putBoolean(data, timedOut); + JfrNativeEventWriter.putLong(data, Word.objectToUntrackedPointer(obj).rawValue()); + JfrNativeEventWriter.endSmallEvent(data); + } + } +} \ No newline at end of file diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadSleepEvent.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadSleepEvent.java new file mode 100644 index 000000000000..73e2ded5047e --- /dev/null +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadSleepEvent.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2022, Red Hat Inc. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 com.oracle.svm.core.jfr.events; + +import org.graalvm.nativeimage.StackValue; + +import com.oracle.svm.core.annotate.Uninterruptible; +import com.oracle.svm.core.jfr.JfrEvent; +import com.oracle.svm.core.jfr.JfrNativeEventWriter; +import com.oracle.svm.core.jfr.JfrNativeEventWriterData; +import com.oracle.svm.core.jfr.JfrNativeEventWriterDataAccess; +import com.oracle.svm.core.jfr.JfrTicks; +import com.oracle.svm.core.jfr.SubstrateJVM; + +public class ThreadSleepEvent { + + public static void emit(long time, long startTicks) { + if (com.oracle.svm.core.jfr.HasJfrSupport.get()) { + emit0(time, startTicks); + } + } + + @Uninterruptible(reason = "Accesses a JFR buffer.") + private static void emit0(long time, long startTicks) { + if (SubstrateJVM.isRecording() && SubstrateJVM.get().isEnabled(JfrEvent.ThreadSleep)) { + JfrNativeEventWriterData data = StackValue.get(JfrNativeEventWriterData.class); + JfrNativeEventWriterDataAccess.initializeThreadLocalNativeBuffer(data); + + JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.ThreadSleep); + JfrNativeEventWriter.putLong(data, startTicks); + JfrNativeEventWriter.putLong(data, JfrTicks.elapsedTicks() - startTicks); + JfrNativeEventWriter.putEventThread(data); + JfrNativeEventWriter.putLong(data, SubstrateJVM.get().getStackTraceId(JfrEvent.ThreadSleep, 0)); + JfrNativeEventWriter.putLong(data, time); + JfrNativeEventWriter.endSmallEvent(data); + } + } +} \ No newline at end of file diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadStartEvent.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadStartEvent.java index 0352112b672f..2445bce518f4 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadStartEvent.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadStartEvent.java @@ -47,7 +47,7 @@ public static void emit(IsolateThread isolateThread) { JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.ThreadStart); JfrNativeEventWriter.putLong(data, JfrTicks.elapsedTicks()); JfrNativeEventWriter.putEventThread(data); - JfrNativeEventWriter.putLong(data, svm.getStackTraceId(JfrEvent.ThreadStart.getId(), 0)); + JfrNativeEventWriter.putLong(data, svm.getStackTraceId(JfrEvent.ThreadStart, 0)); JfrNativeEventWriter.putThread(data, isolateThread); JfrNativeEventWriter.putLong(data, SubstrateJVM.getParentThreadId(isolateThread)); JfrNativeEventWriter.endSmallEvent(data); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java index 82eff9b73015..4ef904f0c819 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java @@ -56,6 +56,7 @@ import com.oracle.svm.core.thread.ThreadStatus; import com.oracle.svm.core.thread.VMOperationControl; import com.oracle.svm.core.util.VMError; +import com.oracle.svm.core.jfr.events.JavaMonitorWaitEvent; import jdk.internal.misc.Unsafe; @@ -370,13 +371,18 @@ protected void doWait(Object obj, long timeoutMillis) throws InterruptedExceptio */ JavaMonitor lock = ensureLocked(obj); Condition condition = getOrCreateCondition(lock, true); + long startTicks = com.oracle.svm.core.jfr.JfrTicks.elapsedTicks(); if (timeoutMillis == 0L) { condition.await(); com.oracle.svm.core.thread.Target_java_lang_Thread t = SubstrateUtil.cast(Thread.currentThread(), com.oracle.svm.core.thread.Target_java_lang_Thread.class); - - System.out.println("notifier id is: "+ t.notifierTid); + JavaMonitorWaitEvent.emit(startTicks, obj, t.notifierTid, timeoutMillis, false); } else { - condition.await(timeoutMillis, TimeUnit.MILLISECONDS); + if (condition.await(timeoutMillis, TimeUnit.MILLISECONDS)) { + com.oracle.svm.core.thread.Target_java_lang_Thread t = SubstrateUtil.cast(Thread.currentThread(), com.oracle.svm.core.thread.Target_java_lang_Thread.class); + JavaMonitorWaitEvent.emit(startTicks, obj, t.notifierTid, timeoutMillis, false); + } else { + JavaMonitorWaitEvent.emit(startTicks, obj, 0, timeoutMillis, true); + } } } @@ -603,28 +609,6 @@ final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Conditi @Alias private transient Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode lastWaiter; -// @Substitute -// public final void signal() { -// Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode first = this.firstWaiter; -// if (first != null) { -// System.out.println(Thread.currentThread().getId()); -// Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node firstNode = SubstrateUtil.cast(first, Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.class); -// com.oracle.svm.core.thread.Target_java_lang_Thread t = SubstrateUtil.cast(firstNode.waiter, com.oracle.svm.core.thread.Target_java_lang_Thread.class); -// t.notifierTid = Thread.currentThread().getId(); -// this.doSignal(first, false); -// } -// } -// -// public final void signalAll() { -// Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode first = this.firstWaiter; -// if (first != null) { -// System.out.println(Thread.currentThread().getId()); -// Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node firstNode = SubstrateUtil.cast(first, Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.class); -// com.oracle.svm.core.thread.Target_java_lang_Thread t = SubstrateUtil.cast(firstNode.waiter, com.oracle.svm.core.thread.Target_java_lang_Thread.class); -// t.notifierTid = Thread.currentThread().getId(); -// this.doSignal(first, true); -// } -// } @Substitute private void doSignal(Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode first, boolean all) { while(true) { @@ -640,7 +624,6 @@ private void doSignal(Target_java_util_concurrent_locks_AbstractQueuedSynchroniz break label19; } - System.out.println(Thread.currentThread().getId()); com.oracle.svm.core.thread.Target_java_lang_Thread t = SubstrateUtil.cast(firstNode.waiter, com.oracle.svm.core.thread.Target_java_lang_Thread.class); t.notifierTid = Thread.currentThread().getId(); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/JavaThreads.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/JavaThreads.java index c115adfcbd48..226ebe568659 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/JavaThreads.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/JavaThreads.java @@ -31,6 +31,7 @@ import java.util.concurrent.atomic.AtomicLong; import com.oracle.svm.core.SubstrateUtil; +import com.oracle.svm.core.jfr.events.ThreadSleepEvent; import org.graalvm.compiler.api.replacements.Fold; import org.graalvm.compiler.core.common.SuppressFBWarnings; import org.graalvm.compiler.serviceprovider.JavaVersionUtil; @@ -294,11 +295,13 @@ static void initializeNewThread( } static void sleep(long millis) throws InterruptedException { + long startTicks = com.oracle.svm.core.jfr.JfrTicks.elapsedTicks(); if (supportsVirtual() && isVirtualDisallowLoom(Thread.currentThread())) { VirtualThreads.singleton().sleepMillis(millis); } else { PlatformThreads.sleep(millis); } + ThreadSleepEvent.emit(millis, startTicks); } static boolean isAlive(Thread thread) { From 72a101bed1b5f7cf9362eae5cc6f166eb69e0574 Mon Sep 17 00:00:00 2001 From: Robert Toyonaga Date: Mon, 4 Jul 2022 15:28:04 -0400 Subject: [PATCH 5/8] target only for jdk17 or later --- .../svm/core/monitor/MultiThreadedMonitorSupport.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java index 4ef904f0c819..3686307cc8fb 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java @@ -48,6 +48,7 @@ import com.oracle.svm.core.annotate.RestrictHeapAccess; import com.oracle.svm.core.annotate.RestrictHeapAccess.Access; import com.oracle.svm.core.annotate.TargetClass; +import com.oracle.svm.core.annotate.TargetElement; import com.oracle.svm.core.annotate.Uninterruptible; import com.oracle.svm.core.hub.DynamicHub; import com.oracle.svm.core.hub.DynamicHubCompanion; @@ -581,6 +582,7 @@ final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer { @Alias // volatile int state; @Alias + @TargetElement(name = "enqueue", onlyWith = com.oracle.svm.core.jdk.JDK17OrLater.class) final native void enqueue(Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node node); } @com.oracle.svm.core.annotate.TargetClass(value = java.util.concurrent.locks.AbstractQueuedSynchronizer.class, innerClass = "Node") @@ -588,6 +590,7 @@ final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node { @Alias Thread waiter; @Alias + @TargetElement(name = "getAndUnsetStatus", onlyWith = com.oracle.svm.core.jdk.JDK17OrLater.class) final native int getAndUnsetStatus(int v); } @@ -595,6 +598,7 @@ final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node { final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode { @Alias + @TargetElement(name = "nextWaiter", onlyWith = com.oracle.svm.core.jdk.JDK17OrLater.class) Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode nextWaiter; } @@ -605,11 +609,14 @@ final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Conditi @Alias Target_java_util_concurrent_locks_AbstractQueuedSynchronizer this$0; @Alias + @TargetElement(name = "firstWaiter", onlyWith = com.oracle.svm.core.jdk.JDK17OrLater.class) private transient Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode firstWaiter; @Alias + @TargetElement(name = "lastWaiter", onlyWith = com.oracle.svm.core.jdk.JDK17OrLater.class) private transient Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode lastWaiter; @Substitute + @TargetElement(name = "doSignal", onlyWith = com.oracle.svm.core.jdk.JDK17OrLater.class) private void doSignal(Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode first, boolean all) { while(true) { Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode next; From 1fda798b64aa1b828f1e9184e773e63f6c0a5915 Mon Sep 17 00:00:00 2001 From: Robert Toyonaga Date: Mon, 4 Jul 2022 15:35:02 -0400 Subject: [PATCH 6/8] checkstyle --- .../core/jfr/events/JavaMonitorWaitEvent.java | 2 +- .../svm/core/jfr/events/ThreadSleepEvent.java | 2 +- .../monitor/MultiThreadedMonitorSupport.java | 6 ++++- ...locks_AbstractQueuedSynchronizer_Node.java | 25 ------------------- .../AnnotationSubstitutionProcessor.java | 12 --------- 5 files changed, 7 insertions(+), 40 deletions(-) delete mode 100644 substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.java diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorWaitEvent.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorWaitEvent.java index f04625062e30..d27fa5c1d8ce 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorWaitEvent.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/JavaMonitorWaitEvent.java @@ -59,4 +59,4 @@ private static void emit0(long startTicks, Object obj, long notifier, long timeo JfrNativeEventWriter.endSmallEvent(data); } } -} \ No newline at end of file +} diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadSleepEvent.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadSleepEvent.java index 73e2ded5047e..e927dd0744a4 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadSleepEvent.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ThreadSleepEvent.java @@ -59,4 +59,4 @@ private static void emit0(long time, long startTicks) { JfrNativeEventWriter.endSmallEvent(data); } } -} \ No newline at end of file +} diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java index 3686307cc8fb..443b8dd95027 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java @@ -30,8 +30,12 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.*; +import java.util.concurrent.locks.AbstractOwnableSynchronizer; +import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.LockSupport; +import java.util.concurrent.locks.ReentrantLock; import org.graalvm.compiler.core.common.SuppressFBWarnings; import org.graalvm.compiler.serviceprovider.JavaVersionUtil; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.java deleted file mode 100644 index 21964d4a751e..000000000000 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node.java +++ /dev/null @@ -1,25 +0,0 @@ -//package com.oracle.svm.core.monitor; -// -//import java.util.ArrayList; -//import java.util.concurrent.locks.AbstractQueuedSynchronizer; -// -//@com.oracle.svm.core.annotate.TargetClass(value = java.util.concurrent.locks.AbstractQueuedSynchronizer.class, onlyWith = com.oracle.svm.core.jfr.HasJfrSupport.class, innerClass = "Node") -//public final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node { -// @com.oracle.svm.core.annotate.Inject -//// @com.oracle.svm.core.annotate.RecomputeFieldValue(kind = com.oracle.svm.core.annotate.RecomputeFieldValue.Kind.NewInstance)// -// public long notifierId; -// -// @com.oracle.svm.core.annotate.Alias -// native boolean compareAndSetWaitStatus(int expect, int update); -// -// @com.oracle.svm.core.annotate.Alias -// static final int CONDITION = -2; //is this correct? -// @com.oracle.svm.core.annotate.Alias -// static final int SIGNAL = -1; -// -// @com.oracle.svm.core.annotate.Alias -// volatile int waitStatus; -// -// @com.oracle.svm.core.annotate.Alias -// volatile Thread thread; -//} \ No newline at end of file diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java index 063a96354464..98202a0d1f9c 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java @@ -786,14 +786,10 @@ private ResolvedJavaMethod findOriginalMethod(Executable annotatedMethod, Class< if (originalName.length() == 0) { originalName = annotatedMethod.getName(); } - Class[] originalParams_ = null; - Method originalMethod_ = null; try { if (annotatedMethod instanceof Method && !originalName.equals(TargetElement.CONSTRUCTOR_NAME)) { Class[] originalParams = interceptParameterTypes(annotatedMethod.getParameterTypes()); - originalParams_ = originalParams; Method originalMethod = originalClass.getDeclaredMethod(originalName, originalParams); - originalMethod_ = originalMethod; guarantee(Modifier.isStatic(annotatedMethod.getModifiers()) == Modifier.isStatic(originalMethod.getModifiers()), "Static modifier mismatch: %s, %s", annotatedMethod, originalMethod); return metaAccess.lookupJavaMethod(originalMethod); @@ -805,14 +801,6 @@ private ResolvedJavaMethod findOriginalMethod(Executable annotatedMethod, Class< } } catch (NoSuchMethodException ex) { - if ( originalParams_ !=null) { - System.out.println(originalParams_.toString()); - } - if ( originalMethod_ !=null) { - System.out.println(originalMethod_.toString()); - } - System.out.println(originalName); - System.out.println(originalClass.toString()); throw UserError.abort("Could not find target method: %s", annotatedMethod); } catch (LinkageError error) { throw UserError.abort("Cannot find %s.%s, %s can not be loaded, due to %s not being available in the classpath. Are you missing a dependency in your classpath?", From b61e35530fae8b7946db67df9b8f522c3e2b38c5 Mon Sep 17 00:00:00 2001 From: Robert Toyonaga Date: Mon, 4 Jul 2022 15:47:44 -0400 Subject: [PATCH 7/8] clean up diff --- .../com/oracle/svm/core/jdk/Target_java_util_ServiceLoader.java | 2 +- .../svm/hosted/substitute/AnnotationSubstitutionProcessor.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_java_util_ServiceLoader.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_java_util_ServiceLoader.java index ff885dc8950f..2079b7c4ea88 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_java_util_ServiceLoader.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_java_util_ServiceLoader.java @@ -132,7 +132,7 @@ private boolean hasNextService() { } catch (ServiceConfigurationError e) { nextError = e; } - } + } return true; } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java index 98202a0d1f9c..8a3aae68a486 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/AnnotationSubstitutionProcessor.java @@ -786,10 +786,12 @@ private ResolvedJavaMethod findOriginalMethod(Executable annotatedMethod, Class< if (originalName.length() == 0) { originalName = annotatedMethod.getName(); } + try { if (annotatedMethod instanceof Method && !originalName.equals(TargetElement.CONSTRUCTOR_NAME)) { Class[] originalParams = interceptParameterTypes(annotatedMethod.getParameterTypes()); Method originalMethod = originalClass.getDeclaredMethod(originalName, originalParams); + guarantee(Modifier.isStatic(annotatedMethod.getModifiers()) == Modifier.isStatic(originalMethod.getModifiers()), "Static modifier mismatch: %s, %s", annotatedMethod, originalMethod); return metaAccess.lookupJavaMethod(originalMethod); From a363d0becc0448cc13ca3b8e6238b1a0595a36c8 Mon Sep 17 00:00:00 2001 From: Robert Toyonaga Date: Mon, 4 Jul 2022 16:07:30 -0400 Subject: [PATCH 8/8] add target jdk17 later to classes --- .../oracle/svm/core/monitor/MultiThreadedMonitorSupport.java | 4 ++-- .../src/com/oracle/svm/core/thread/JavaThreads.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java index 7b23d0493ee8..03c6e5781c11 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/monitor/MultiThreadedMonitorSupport.java @@ -596,7 +596,7 @@ final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer { @TargetElement(name = "enqueue", onlyWith = com.oracle.svm.core.jdk.JDK17OrLater.class) final native void enqueue(Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node node); } -@com.oracle.svm.core.annotate.TargetClass(value = java.util.concurrent.locks.AbstractQueuedSynchronizer.class, innerClass = "Node") +@TargetClass(value = java.util.concurrent.locks.AbstractQueuedSynchronizer.class, innerClass = "Node", onlyWith = com.oracle.svm.core.jdk.JDK17OrLater.class) final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node { @Alias Thread waiter; @@ -605,7 +605,7 @@ final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_Node { final native int getAndUnsetStatus(int v); } -@com.oracle.svm.core.annotate.TargetClass(value = java.util.concurrent.locks.AbstractQueuedSynchronizer.class, innerClass = "ConditionNode") +@TargetClass(value = java.util.concurrent.locks.AbstractQueuedSynchronizer.class, innerClass = "ConditionNode", onlyWith = com.oracle.svm.core.jdk.JDK17OrLater.class) final class Target_java_util_concurrent_locks_AbstractQueuedSynchronizer_ConditionNode { @Alias diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/JavaThreads.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/JavaThreads.java index fbcea3569130..be79012a7b44 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/JavaThreads.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/JavaThreads.java @@ -30,7 +30,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import com.oracle.svm.core.SubstrateUtil; import com.oracle.svm.core.jfr.events.ThreadSleepEvent; import org.graalvm.compiler.api.replacements.Fold;