RFR: 8318839: Update test thread factory to catch all exceptions [v2]

David Holmes dholmes at openjdk.org
Fri Nov 3 05:47:04 UTC 2023


On Fri, 3 Nov 2023 03:44:31 GMT, Leonid Mesnik <lmesnik at 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.
>
> Leonid Mesnik has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Replaced System.exit() with exception.

Changes requested by dholmes (Reviewer).

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

> 74:                         uncaughtException = null;
> 75:                         Thread.setDefaultUncaughtExceptionHandler(null);
> 76:                     }

I don't understand what this is trying to do. If any virtual thread has an uncaught exception then other virtual threads will throw it wrapped in a RuntimeException. But the first virtual thread that completes (normally or by throwing) will clear the default UEH that you set, so uncaught exceptions from other virtual threads won't do anything.

AFAICS setting the UEH for a virtual thread works fine, so why are you not setting a per-thread handler?

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

PR Review: https://git.openjdk.org/jdk/pull/16369#pullrequestreview-1711859772
PR Review Comment: https://git.openjdk.org/jdk/pull/16369#discussion_r1381179648


More information about the core-libs-dev mailing list