[jdk19] RFR: 8287847: Fatal Error when suspending virtual thread after it has terminated [v2]

Alan Bateman alanb at openjdk.org
Thu Jun 30 06:38:42 UTC 2022


On Wed, 29 Jun 2022 23:24:28 GMT, Chris Plummer <cjplummer at openjdk.org> wrote:

>> test/jdk/com/sun/jdi/SuspendAfterDeath.java line 62:
>> 
>>> 60: public class SuspendAfterDeath extends TestScaffold {
>>> 61:     private volatile ThreadReference thread;
>>> 62:     private volatile boolean breakpointReached = false;
>> 
>> The volatile-write to initialise this to false is not needed here.
>
> Actually I was a bit confused as to why thread was declared volatile, so I just followed the pattern. Maybe you can explain since you wrote it.

II'm just pointing out that initialising breakpointReached to false is unnecessary as it's the default value.

>> test/jdk/com/sun/jdi/SuspendAfterDeath.java line 99:
>> 
>>> 97:             List argList = new ArrayList(Arrays.asList(args));
>>> 98:             argList.add("Virtual");
>>> 99:             args = (String[]) argList.toArray(args);
>> 
>> The raw type and casting caught my addition here. Here's something more succulent if you'd like:
>> 
>> args = Stream.concat(Stream.of(args), Stream.of("Virtual"))
>>                 .toArray(String[]::new);
>
> That came from TestScaffold.startUp():
> 
>     protected void startUp(String targetName) {
>         List argList = new ArrayList(Arrays.asList(args));
>         argList.add(targetName);
>         println("run args: " + argList);
>         connect((String[]) argList.toArray(args));
>         waitForVMStart();
>     }
> 
> TBH I find myself staring at Streams code like that for way too long before I figure out what it is trying to do. If you use/read code like that a lot, it's probably not an issue, but I don't, and prefer something more straight forward, even if it is not nearly as elegant. Someone should add `String[] Arrays.appendToArray(String[] arr, String s)`, or even `String[] Arrays.concat(String[] s1, String[] s2)` would do.

Whatever you are comfortable with but I think we should add the raw type and avoid the cast.

>> test/jdk/com/sun/jdi/SuspendAfterDeath.java line 135:
>> 
>>> 133:         }
>>> 134:     }
>>> 135: }
>> 
>> I wonder if we need to add `@run main/othervm -Dmain.wrapper=Virtual SuspendAfterDeath` to the test description so that running the jdk_jdi test group will exercise the issue. As it stands, I think it would require a test run with -Dmain.wrapper=Virtual to exercise this code.
>
> Yes, it requires `-Dmain.wrapper=Virtual`, and that was intentional. My thinking was that we don't have any com/sun/jdi tests that do any virtual thread testing unless run with `-Dmain.wrapper=Virtual`, so why should this test be any different? If I made it do virtual thread testing without `-Dmain.wrapper=Virtual`, then the `-Dmain.wrapper=Virtual` testing becomes redundant.

The test uses a platform thread by default so it's not testing the issue in JDK-8287847. The suggestion is to have it re-run with the system property set, like this:

@run main/othervm SuspendAfterDeath 
@run main/othervm -Dmain.wrapper=Virtual SuspendAfterDeath 

I accept this may be different to the existing com/sun/jdi tests but they pre-date virtual threads.

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

PR: https://git.openjdk.org/jdk19/pull/88


More information about the serviceability-dev mailing list