Skip to content

Commit d9910dd

Browse files
mikehearnrakachan
authored andcommitted
[GR-64721] Espresso: implement Thread.dumpThreads
PullRequest: graal/20712
2 parents f8a5bef + 2aadfcd commit d9910dd

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/staticobject/StaticObject.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,9 @@ private Object getArray(EspressoLanguage language) {
311311
return language.getArrayProperty().getObject(this);
312312
}
313313

314+
/**
315+
* Returns a Java array based on this static object, which must be a guest array.
316+
*/
314317
@SuppressWarnings("unchecked")
315318
public final <T> T unwrap(EspressoLanguage language) {
316319
checkNotForeign();

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/standard/Target_java_lang_Thread.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import static com.oracle.truffle.espresso.threads.EspressoThreadRegistry.getThreadId;
2727
import static com.oracle.truffle.espresso.threads.ThreadState.TIMED_SLEEPING;
2828

29-
import java.util.Arrays;
3029
import java.util.concurrent.TimeUnit;
3130
import java.util.concurrent.atomic.AtomicLong;
3231

@@ -116,21 +115,6 @@ public static void setCurrentThread(@JavaType(Thread.class) StaticObject self, @
116115
return context.getVM().JVM_GetAllThreads(null);
117116
}
118117

119-
@Substitution
120-
public static @JavaType(StackTraceElement[][].class) StaticObject dumpThreads(@JavaType(Thread[].class) StaticObject threads, @Inject EspressoLanguage language, @Inject Meta meta) {
121-
if (StaticObject.isNull(threads)) {
122-
throw meta.throwNullPointerException();
123-
}
124-
if (threads.length(language) == 0) {
125-
throw meta.throwException(meta.java_lang_IllegalArgumentException);
126-
}
127-
EspressoContext context = meta.getContext();
128-
StaticObject trace = StaticObject.createArray(meta.java_lang_StackTraceElement.array(), StaticObject.EMPTY_ARRAY, context);
129-
StaticObject[] toWrap = new StaticObject[threads.length(language)];
130-
Arrays.fill(toWrap, trace);
131-
return StaticObject.createArray(meta.java_lang_StackTraceElement.array().array(), toWrap, context);
132-
}
133-
134118
@Substitution(hasReceiver = true)
135119
abstract static class Start0 extends SubstitutionNode {
136120
abstract void execute(@JavaType(Thread.class) StaticObject self);
@@ -332,6 +316,22 @@ public static void setNativeName(@JavaType(Thread.class) StaticObject self, @Jav
332316
hostThread.setName(meta.toHostString(name));
333317
}
334318

319+
// Return an array of stack traces (arrays of stack trace elements), one for each thread in the
320+
// threads array, or NULL for threads that were unresponsive.
321+
@Substitution
322+
public static @JavaType(StackTraceElement[][].class) StaticObject dumpThreads(@JavaType(Thread[].class) StaticObject threadsArray,
323+
@Inject EspressoLanguage language, @Inject Meta meta, @Inject EspressoContext context, @Inject SubstitutionProfiler location) {
324+
if (StaticObject.isNull(threadsArray)) {
325+
throw meta.throwNullPointerException();
326+
}
327+
if (threadsArray.length(language) == 0) {
328+
throw meta.throwException(meta.java_lang_IllegalArgumentException);
329+
}
330+
VM.StackTrace[] traces = ThreadRequests.getStackTraces(context, InterpreterToVM.MAX_STACK_DEPTH, location, threadsArray.unwrap(language));
331+
return meta.java_lang_StackTraceElement.array().allocateReferenceArray(traces.length,
332+
i -> traces[i] == null ? StaticObject.NULL : traces[i].toGuest(context));
333+
}
334+
335335
@Substitution(languageFilter = VersionFilter.Java19OrLater.class, hasReceiver = true)
336336
abstract static class GetStackTrace0 extends SubstitutionNode {
337337
abstract @JavaType(Object.class) StaticObject execute(@JavaType(Thread.class) StaticObject self);

0 commit comments

Comments
 (0)