From 07ebda54f290cc17c6682abd26ceca2868488a63 Mon Sep 17 00:00:00 2001 From: Inigo Mediavilla Saiz Date: Wed, 19 Jun 2024 10:35:32 +0000 Subject: [PATCH] 8334215: serviceability/dcmd/thread/PrintMountedVirtualThread.java failing with JTREG_TEST_THREAD_FACTORY=Virtual Reviewed-by: dholmes --- src/hotspot/share/runtime/threads.cpp | 7 +++++-- .../dcmd/thread/PrintMountedVirtualThread.java | 17 ++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index e65470ac526..9800f85dfe4 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -1332,8 +1332,11 @@ void Threads::print_on(outputStream* st, bool print_stacks, if (p->is_vthread_mounted()) { const oop vt = p->vthread(); assert(vt != nullptr, "vthread should not be null when vthread is mounted"); - st->print_cr(" Mounted virtual thread \"%s\" #" INT64_FORMAT, JavaThread::name_for(vt), (int64_t)java_lang_Thread::thread_id(vt)); - p->print_vthread_stack_on(st); + // JavaThread._vthread can refer to the carrier thread. Print only if _vthread refers to a virtual thread. + if (vt != thread_oop) { + st->print_cr(" Mounted virtual thread #" INT64_FORMAT, (int64_t)java_lang_Thread::thread_id(vt)); + p->print_vthread_stack_on(st); + } } } } diff --git a/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java b/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java index bffe4c266a4..04163d7536a 100644 --- a/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java +++ b/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java @@ -26,7 +26,6 @@ import jdk.test.lib.dcmd.JMXExecutor; import jdk.test.lib.process.OutputAnalyzer; import org.junit.Test; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; @@ -41,16 +40,18 @@ public class PrintMountedVirtualThread { public void run(CommandExecutor executor) throws InterruptedException { var shouldFinish = new AtomicBoolean(false); - var started = new CountDownLatch(1); + var started = new AtomicBoolean(); final Runnable runnable = new DummyRunnable(shouldFinish, started); try { Thread vthread = Thread.ofVirtual().name("Dummy Vthread").start(runnable); - started.await(); + while (!started.get()) { + Thread.sleep(10); + } /* Execute */ OutputAnalyzer output = executor.execute("Thread.print"); output.shouldMatch(".*at " + Pattern.quote(DummyRunnable.class.getName()) + "\\.run.*"); output.shouldMatch(".*at " + Pattern.quote(DummyRunnable.class.getName()) + "\\.compute.*"); - output.shouldMatch("Mounted virtual thread " + "\"Dummy Vthread\"" + " #" + vthread.threadId()); + output.shouldMatch("Mounted virtual thread " + "#" + vthread.threadId()); } finally { shouldFinish.set(true); @@ -63,11 +64,10 @@ public class PrintMountedVirtualThread { } static class DummyRunnable implements Runnable { - private final AtomicBoolean shouldFinish; - private final CountDownLatch started; + private final AtomicBoolean started; - public DummyRunnable(AtomicBoolean shouldFinish, CountDownLatch started) { + public DummyRunnable(AtomicBoolean shouldFinish, AtomicBoolean started) { this.shouldFinish = shouldFinish; this.started = started; } @@ -77,12 +77,11 @@ public class PrintMountedVirtualThread { } void compute() { - started.countDown(); + started.set(true); while (!shouldFinish.get()) { Thread.onSpinWait(); } } } - }