28 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_THREAD_OBJECT_LOCATION;
29 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.osThreadInterruptedOffset;
30 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.osThreadOffset;
31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.threadObjectOffset;
32
33 import org.graalvm.compiler.api.replacements.ClassSubstitution;
34 import org.graalvm.compiler.api.replacements.MethodSubstitution;
35 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
36 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
37 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
38 import org.graalvm.compiler.hotspot.nodes.CurrentJavaThreadNode;
39 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
40 import org.graalvm.compiler.word.Word;
41
42 /**
43 * Substitutions for {@link java.lang.Thread} methods.
44 */
45 @ClassSubstitution(Thread.class)
46 public class ThreadSubstitutions {
47
48 @MethodSubstitution(isStatic = false)
49 public static boolean isInterrupted(final Thread thisObject, boolean clearInterrupted) {
50 Word javaThread = CurrentJavaThreadNode.get();
51 Object thread = javaThread.readObject(threadObjectOffset(INJECTED_VMCONFIG), JAVA_THREAD_THREAD_OBJECT_LOCATION);
52 if (thisObject == thread) {
53 Word osThread = javaThread.readWord(osThreadOffset(INJECTED_VMCONFIG), JAVA_THREAD_OSTHREAD_LOCATION);
54 boolean interrupted = osThread.readInt(osThreadInterruptedOffset(INJECTED_VMCONFIG), any()) != 0;
55 if (!interrupted || !clearInterrupted) {
56 return interrupted;
57 }
58 }
59
60 return threadIsInterruptedStub(THREAD_IS_INTERRUPTED, thisObject, clearInterrupted);
61 }
62
63 public static final ForeignCallDescriptor THREAD_IS_INTERRUPTED = new ForeignCallDescriptor("thread_is_interrupted", boolean.class, Thread.class, boolean.class);
64
65 @NodeIntrinsic(ForeignCallNode.class)
66 private static native boolean threadIsInterruptedStub(@ConstantNodeParameter ForeignCallDescriptor descriptor, Thread thread, boolean clearIsInterrupted);
67 }
|
28 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_THREAD_OBJECT_LOCATION;
29 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.osThreadInterruptedOffset;
30 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.osThreadOffset;
31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.threadObjectOffset;
32
33 import org.graalvm.compiler.api.replacements.ClassSubstitution;
34 import org.graalvm.compiler.api.replacements.MethodSubstitution;
35 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
36 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
37 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
38 import org.graalvm.compiler.hotspot.nodes.CurrentJavaThreadNode;
39 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
40 import org.graalvm.compiler.word.Word;
41
42 /**
43 * Substitutions for {@link java.lang.Thread} methods.
44 */
45 @ClassSubstitution(Thread.class)
46 public class ThreadSubstitutions {
47
48 /**
49 * hidden in 9.
50 */
51 @MethodSubstitution(isStatic = false, optional = true)
52 public static boolean isInterrupted(final Thread thisObject, boolean clearInterrupted) {
53 Word javaThread = CurrentJavaThreadNode.get();
54 Object thread = javaThread.readObject(threadObjectOffset(INJECTED_VMCONFIG), JAVA_THREAD_THREAD_OBJECT_LOCATION);
55 if (thisObject == thread) {
56 Word osThread = javaThread.readWord(osThreadOffset(INJECTED_VMCONFIG), JAVA_THREAD_OSTHREAD_LOCATION);
57 boolean interrupted = osThread.readInt(osThreadInterruptedOffset(INJECTED_VMCONFIG), any()) != 0;
58 if (!interrupted || !clearInterrupted) {
59 return interrupted;
60 }
61 }
62
63 return threadIsInterruptedStub(THREAD_IS_INTERRUPTED, thisObject, clearInterrupted);
64 }
65
66 public static final ForeignCallDescriptor THREAD_IS_INTERRUPTED = new ForeignCallDescriptor("thread_is_interrupted", boolean.class, Thread.class, boolean.class);
67
68 @NodeIntrinsic(ForeignCallNode.class)
69 private static native boolean threadIsInterruptedStub(@ConstantNodeParameter ForeignCallDescriptor descriptor, Thread thread, boolean clearIsInterrupted);
70 }
|