11/*
22 * Copyright (c) 2021, Red Hat, Inc. All rights reserved.
3+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
34 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
45 *
56 * This code is free software; you can redistribute it and/or modify it
2425
2526/**
2627 * @test TestPrimitiveArrayCriticalWithBadParam
27- * @bug 8269697
28+ * @bug 8269697 8292674
2829 * @summary -Xcheck:jni should catch wrong parameter passed to GetPrimitiveArrayCritical
30+ * @comment Tests reporting with regular thread and virtual thread.
2931 * @library /test/lib
32+ * @enablePreview
3033 * @run main/native TestPrimitiveArrayCriticalWithBadParam
3134 */
3235import java .util .List ;
@@ -47,39 +50,54 @@ public class TestPrimitiveArrayCriticalWithBadParam {
4750
4851 public static void main (String [] args ) {
4952 if (args .length > 0 ) {
50- test ();
53+ test (args [ 0 ] );
5154 } else {
52- runTest ();
55+ runTest (false );
56+ runTest (true );
5357 }
5458 }
5559
56- private static void runTest () {
60+ private static void runTest (boolean useVThread ) {
5761 List <String > pbArgs = new ArrayList <>();
5862 pbArgs .add ("-XX:-CreateCoredumpOnCrash" );
5963 pbArgs .add ("-Xcheck:jni" );
64+ pbArgs .add ("--enable-preview" );
6065 pbArgs .add ("-Djava.library.path=" + Utils .TEST_NATIVE_PATH );
6166 pbArgs .add (TestPrimitiveArrayCriticalWithBadParam .class .getName ());
62- pbArgs .add ("test" );
67+ pbArgs .add (useVThread ? "vtest" : "test" );
6368 try {
6469 ProcessBuilder pb = ProcessTools .createJavaProcessBuilder (pbArgs .toArray (new String [0 ]));
6570 OutputAnalyzer analyzer = new OutputAnalyzer (pb .start ());
6671
6772 // -Xcheck:jni should warn the bad parameter
6873 analyzer .shouldContain ("FATAL ERROR in native method: Primitive type array expected but not received for JNI array operation" );
74+ analyzer .shouldContain ("TestPrimitiveArrayCriticalWithBadParam.pin" );
6975 analyzer .shouldNotHaveExitValue (0 );
7076 } catch (IOException e ) {
7177 throw new RuntimeException (e );
7278 }
7379 }
7480
75- private static void test () {
76- Object [] objs = new Object [10 ];
77- for (int i = 0 ; i < objs .length ; i ++) {
78- objs [i ] = new MyClass ();
81+ private static void test (String mode ) {
82+ Runnable r = () -> {
83+ Object [] objs = new Object [10 ];
84+ for (int i = 0 ; i < objs .length ; i ++) {
85+ objs [i ] = new MyClass ();
86+ }
87+ pin (objs );
88+ System .out .println ("Object array pinned" );
89+ unpin (objs );
90+ };
91+ if (mode .equals ("vtest" )) {
92+ Thread t = Thread .ofVirtual ().start (r );
93+ try {
94+ t .join ();
95+ } catch (InterruptedException ex ) {
96+ throw new Error ("unexpected" , ex );
97+ }
98+ } else {
99+ r .run ();
79100 }
80- pin (objs );
81- System .out .println ("Object array pinned" );
82- unpin (objs );
83101 }
84102 public static class MyClass {
85103 public Object ref = new Object ();
0 commit comments