The debuggee main method creates two threads and then starts them:
public static void main(String[] args) {
System.out.println("Howdy!");
Thread t1 = TestScaffold.newThread(new InvokeHangTarg(), name1);
Thread t2 = TestScaffold.newThread(new InvokeHangTarg(), name2);
t1.start();
t2.start();
}
These threads will hit breakpoints which the debugger handles and issues an
invoke on the breakpoint thread. The threads run until they generate 100
breakpoints. There is an issue when these two threads are virtual threads.
Virtual threads are daemon threads. That means the JVM can exit while they are
still running. The above main() method is not waiting for these two threads to
exit, so main() exits immediately and the JVM starts the shutdown process. It
first must wait for all non-daemon threads to exit, but there are none, so the
JVM exits right away before the two threads are completed. The end result of
this early exit is that sometimes the invoke done by the debugger never
completes because the JVM has already issued a VMDeath event and the debuggee
has been disconnected.
When these two threads are platform threads, the JVM has to wait until they
complete before it exits, so they will always complete. The fix for virtual
threads is to do a join with t1 and t2. This forces the main() method to block
until they have completed.
-------------
Commit messages:
- Make sure main() debuggee method does not exit until test threads are
complete.
Changes: https://git.openjdk.org/jdk/pull/13068/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=13068&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8290200
Stats: 13 lines in 2 files changed: 6 ins; 2 del; 5 mod
Patch: https://git.openjdk.org/jdk/pull/13068.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/13068/head:pull/13068
PR: https://git.openjdk.org/jdk/pull/13068