On Wed, 25 Oct 2023 21:08:01 GMT, Leonid Mesnik <lmes...@openjdk.org> wrote:

> The jtreg starts the main thread in a separate ThreadGroup and checks 
> unhandled exceptions for this group. However, it doesn't catch all unhandled 
> exceptions. There is a jtreg issue for this 
> https://bugs.openjdk.org/browse/CODETOOLS-7903526.
> Catching such issues for virtual threads is important because they are not 
> included in any groups. So this fix implements the handler for the test 
> thread factory. 
> 
> A few tests start failing.
> 
> The test
> serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorVMEventsTest.java
> has testcases for platform and virtual threads. So, there is there's no need 
> to run it with the thread factory.
> 
> The test
> java/lang/Thread/virtual/ThreadAPI.java
> tests UncaughtExceptionHandler and virtual threads. No need to run it with a 
> thread factory.
> 
> Test 
> test/jdk/java/util/concurrent/tck/ThreadTest.java is updated to not check the 
> default empty handler.
> 
> Probably, we need some common approach about dealing with the 
> UncaughtExceptionHandler in jtreg.

Hello Leonid, looking at the changes in this PR, what's being proposed is that 
when jtreg lauches tests through a virtual thread, then this wrapping code will 
set a JVM level `UncaughtExceptionHandler` by calling 
`Thread.setDefaultUncaughtExceptionHandler(...)`. The implementation of this 
`UncaughtExceptionHandler` calls `System.exit(1)`. Wouldn't that kill the test 
VM? I think that would then impact everything else including jtreg report 
generation and such for the test, isn't it? 

I had a look at https://bugs.openjdk.org/browse/JDK-8318839 but it doesn't have 
enough details to help understand what currently happens when a test launched 
through a virtual thread from jtreg throws an uncaught exception. How/what gets 
reported for that test execution?

test/jdk/java/util/concurrent/tck/ThreadTest.java line 79:

> 77:      */
> 78:     public void testGetAndSetDefaultUncaughtExceptionHandler() {
> 79:         assertNull(Thread.getDefaultUncaughtExceptionHandler());

I think this is a very broad change in this test case and either shouldn't be 
done or should be done conditionally (I can't think of the right condition now 
because I haven't fully grasped the context of this PR).

test/jtreg_test_thread_factory/src/share/classes/Virtual.java line 37:

> 35:             // The virtual threads don't belong to any group and need 
> global handler.
> 36:             Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
> 37:                     if (e instanceof ThreadDeath) {

`ThreadDeath` has been deprecated for removal since Java 20, so this should no 
longer be needed.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/16369#issuecomment-1780470987
PR Review Comment: https://git.openjdk.org/jdk/pull/16369#discussion_r1372631138
PR Review Comment: https://git.openjdk.org/jdk/pull/16369#discussion_r1372630017

Reply via email to