Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
1a75277
8330846: Add stacks of mounted virtual threads to the HotSpot thread …
txominpelu May 30, 2024
ae690b2
Remove duplicated Carrying statement and indent vthread stack
txominpelu Jun 3, 2024
47d7746
Merge remote-tracking branch 'upstream/master' into txominpelu_833084…
txominpelu Jun 3, 2024
76e6e58
Add missing header
txominpelu Jun 3, 2024
59b18db
Use JavaThread::print_vthread_stack_on
txominpelu Jun 3, 2024
12a41a5
Update test/hotspot/jtreg/serviceability/dcmd/thread/PrintVirtualThre…
txominpelu Jun 3, 2024
6a3b779
Add indentation for virtual thread stack
txominpelu Jun 3, 2024
9acbf29
Print mounted virtual thread after carrier
txominpelu Jun 3, 2024
e619320
Fix copyright year
txominpelu Jun 4, 2024
b122cc0
Cleanup test
txominpelu Jun 4, 2024
2cc4ba1
Remove extra indentation (leave it for the next PR)
txominpelu Jun 4, 2024
7a57d05
Remove dead code
txominpelu Jun 4, 2024
a483113
Incorporate @tstuefe's remarks
txominpelu Jun 4, 2024
a97184c
Include virtual thread name in output
txominpelu Jun 4, 2024
ba3385a
Merge remote-tracking branch 'upstream/master' into txominpelu_833084…
txominpelu Jun 10, 2024
b1e61b2
Rename test
txominpelu Jun 11, 2024
9591b28
Incorporate Alan's suggestions
txominpelu Jun 11, 2024
69b7ec0
Require continuations to run the test
txominpelu Jun 11, 2024
05d861c
Test fixes: pass to junit, avoid spinning thread on fail
txominpelu Jun 12, 2024
4d6a8cc
Fix scope of the try block
txominpelu Jun 12, 2024
e2b8551
Remove unneeded line
txominpelu Jun 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/hotspot/share/runtime/threads.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1328,6 +1328,15 @@ void Threads::print_on(outputStream* st, bool print_stacks,
p->trace_stack();
} else {
p->print_stack_on(st);
const oop thread_oop = p->threadObj();
if (thread_oop != nullptr) {
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);
}
}
}
}
st->cr();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* Copyright (c) 2024, Oracle and/or its affiliates. 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.
*
* 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.
*/

import jdk.test.lib.dcmd.CommandExecutor;
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;

/*
* @test
* @summary Test of diagnostic command Thread.print with virtual threads
* @requires vm.continuations
* @library /test/lib
* @run junit PrintMountedVirtualThread
*/
public class PrintMountedVirtualThread {

public void run(CommandExecutor executor) throws InterruptedException {
var shouldFinish = new AtomicBoolean(false);
var started = new CountDownLatch(1);
final Runnable runnable = new DummyRunnable(shouldFinish, started);
try {
Thread vthread = Thread.ofVirtual().name("Dummy Vthread").start(runnable);
started.await();
/* 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());

} finally {
shouldFinish.set(true);
}
}

@Test
public void jmx() throws InterruptedException {
run(new JMXExecutor());
}

static class DummyRunnable implements Runnable {

private final AtomicBoolean shouldFinish;
private final CountDownLatch started;

public DummyRunnable(AtomicBoolean shouldFinish, CountDownLatch started) {
this.shouldFinish = shouldFinish;
this.started = started;
}

public void run() {
compute();
}

void compute() {
started.countDown();
while (!shouldFinish.get()) {
Thread.onSpinWait();
}
}
}


}