From 4774b25f7ccb634cee70f173fa2499d58deb0efb Mon Sep 17 00:00:00 2001 From: Wanghuang-Huawei Date: Thu, 8 Apr 2021 10:32:52 +0800 Subject: [PATCH 1/7] 8264760: JVM crashes when two threads encounter the same resolution error --- src/hotspot/share/classfile/systemDictionary.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp index feb895c09f810..d5b0757473bd5 100644 --- a/src/hotspot/share/classfile/systemDictionary.cpp +++ b/src/hotspot/share/classfile/systemDictionary.cpp @@ -1935,8 +1935,7 @@ void SystemDictionary::add_nest_host_error(const constantPoolHandle& pool, { MutexLocker ml(Thread::current(), SystemDictionary_lock); ResolutionErrorEntry* entry = resolution_errors()->find_entry(index, hash, pool, which); - if (entry != NULL) { - assert(entry->nest_host_error() == NULL, "Nest host error message already set!"); + if (entry != NULL && entry->nest_host_error() == NULL) { entry->set_nest_host_error(message); } else { resolution_errors()->add_entry(index, hash, pool, which, message); From 7d7c7442bb0cff1c4486a6f626c534d5ff0e5349 Mon Sep 17 00:00:00 2001 From: Wanghuang-Huawei Date: Thu, 8 Apr 2021 11:24:50 +0800 Subject: [PATCH 2/7] add test cases --- .../membership/HostNoNestMember.jcod | 114 ++++++++++++++++++ .../TestNestHostErrorWithMultiThread.java | 82 +++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.jcod create mode 100644 test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java diff --git a/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.jcod b/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.jcod new file mode 100644 index 0000000000000..66ea2f47a1050 --- /dev/null +++ b/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.jcod @@ -0,0 +1,114 @@ +class HostNoNestMember { + 0xCAFEBABE; + 0; // minor version + 60; // version + [] { // Constant Pool + ; // first element is empty + Method #2 #3; // #1 + class #4; // #2 + NameAndType #5 #6; // #3 + Utf8 "java/lang/Object"; // #4 + Utf8 ""; // #5 + Utf8 "()V"; // #6 + class #8; // #7 + Utf8 "HostNoNestMember$Member"; // #8 + Method #7 #10; // #9 + NameAndType #5 #11; // #10 + Utf8 "(LHostNoNestMember;)V"; // #11 + Field #7 #13; // #12 + NameAndType #14 #15; // #13 + Utf8 "value"; // #14 + Utf8 "I"; // #15 + class #17; // #16 + Utf8 "HostNoNestMember"; // #17 + Utf8 "Code"; // #18 + Utf8 "LineNumberTable"; // #19 + Utf8 "foo"; // #20 + Utf8 "()I"; // #21 + Utf8 "SourceFile"; // #22 + Utf8 "TestNestHostErrorWithMultiThread.java"; // #23 + Utf8 "NestMembers"; // #24 + Utf8 "InnerClasses"; // #25 + Utf8 "Member"; // #26 + } // Constant Pool + + 0x0020; // access + #16;// this_cpx + #2;// super_cpx + + [] { // Interfaces + } // Interfaces + + [] { // Fields + } // Fields + + [] { // Methods + { // method + 0x0000; // access + #5; // name_index + #6; // descriptor_index + [] { // Attributes + Attr(#18) { // Code + 1; // max_stack + 1; // max_locals + Bytes[]{ + 0x2AB70001B1; + } + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#19) { // LineNumberTable + [] { // line_number_table + 0 3; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } + ; + { // method + 0x0001; // access + #20; // name_index + #21; // descriptor_index + [] { // Attributes + Attr(#18) { // Code + 3; // max_stack + 2; // max_locals + Bytes[]{ + 0xBB0007592AB70009; + 0x4C2BB4000CAC; + } + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#19) { // LineNumberTable + [] { // line_number_table + 0 9; + 9 10; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } + } // Methods + + [] { // Attributes + Attr(#22) { // SourceFile + #23; + } // end SourceFile + ; + Attr(#24) { // NestMembers + [] { // classes + // #7; delete NestMember + } + } // end NestMembers + ; + Attr(#25) { // InnerClasses + [] { // classes + #7 #16 #26 0; + } + } // end InnerClasses + } // Attributes +} // end class HostNoNestMember diff --git a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java new file mode 100644 index 0000000000000..daa4a2cdb9128 --- /dev/null +++ b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2021, Huawei Technologies Co., Ltd. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8264760 + * @summary JVM crashes when two threads encounter the same resolution error + * + * @library /test/lib + * @compile TestNestHostErrorWithMultiThread.java + * @compile HostNoNestMember.jcod + * + * @run main/othervm TestNestHostErrorWithMultiThread + */ + +import java.util.concurrent.CountDownLatch; + +class HostNoNestMember { + class Member { + private int value; + } + + public int foo() { + Member m = new Member(); + return m.value; + } +} + +public class TestNestHostErrorWithMultiThread { + + public static void main(String args[]) { + TestNestHostErrorWithMultiThread t = new TestNestHostErrorWithMultiThread(); + t.test(); + } + + public void test() { + + CountDownLatch latch = new CountDownLatch(1); + + new Thread(() -> { + try { + latch.await(); + HostNoNestMember h = new HostNoNestMember(); + h.foo(); + } catch (Exception e) { + e.printStackTrace(); + } + }).start(); + + new Thread(() -> { + try { + latch.await(); + HostNoNestMember h = new HostNoNestMember(); + h.foo(); + } catch (Exception e) { + e.printStackTrace(); + } + }).start(); + + latch.countDown(); + } +} From b11b658aaa9a75a4d7944a097dde67bd205a1a51 Mon Sep 17 00:00:00 2001 From: Wanghuang-Huawei Date: Thu, 8 Apr 2021 12:24:45 +0800 Subject: [PATCH 3/7] add throw exception --- .../TestNestHostErrorWithMultiThread.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java index daa4a2cdb9128..c6d5924f4b4ca 100644 --- a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java +++ b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java @@ -48,12 +48,12 @@ public int foo() { public class TestNestHostErrorWithMultiThread { - public static void main(String args[]) { + public static void main(String args[]) throws Throwable { TestNestHostErrorWithMultiThread t = new TestNestHostErrorWithMultiThread(); t.test(); } - public void test() { + public void test() throws Throwable { CountDownLatch latch = new CountDownLatch(1); @@ -62,9 +62,9 @@ public void test() { latch.await(); HostNoNestMember h = new HostNoNestMember(); h.foo(); - } catch (Exception e) { - e.printStackTrace(); - } + } catch (IllegalAccessError expected) { + System.out.println("OK - got expected exception: " + expected); + } catch (InterruptedException e) {} }).start(); new Thread(() -> { @@ -72,9 +72,9 @@ public void test() { latch.await(); HostNoNestMember h = new HostNoNestMember(); h.foo(); - } catch (Exception e) { - e.printStackTrace(); - } + } catch (IllegalAccessError expected) { + System.out.println("OK - got expected exception: " + expected); + } catch (InterruptedException e) {} }).start(); latch.countDown(); From b9933eabb51f660d3e0e649ce47fc4ece8f086df Mon Sep 17 00:00:00 2001 From: Wanghuang-Huawei Date: Fri, 23 Apr 2021 10:54:37 +0800 Subject: [PATCH 4/7] fix bugs --- .../share/classfile/systemDictionary.cpp | 4 ++ .../membership/HostNoNestMember.java | 39 +++++++++++ .../membership/HostNoNestMember.jcod | 35 ++++++++-- .../TestNestHostErrorWithMultiThread.java | 64 +++++++++---------- 4 files changed, 105 insertions(+), 37 deletions(-) create mode 100644 test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.java diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp index d5b0757473bd5..2c34ddab92404 100644 --- a/src/hotspot/share/classfile/systemDictionary.cpp +++ b/src/hotspot/share/classfile/systemDictionary.cpp @@ -1936,6 +1936,10 @@ void SystemDictionary::add_nest_host_error(const constantPoolHandle& pool, MutexLocker ml(Thread::current(), SystemDictionary_lock); ResolutionErrorEntry* entry = resolution_errors()->find_entry(index, hash, pool, which); if (entry != NULL && entry->nest_host_error() == NULL) { + // An existing entry means we had a true resolution failure (LinkageError) with our nest host, but we + // still want to add the error message for the higher-level access checks to report. We should + // only reach here under the same error condition, so we can ignore the potential race with setting + // the message. If we see it is already set then we can ignore it. entry->set_nest_host_error(message); } else { resolution_errors()->add_entry(index, hash, pool, which, message); diff --git a/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.java b/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.java new file mode 100644 index 0000000000000..2f919770de96f --- /dev/null +++ b/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021, Huawei Technologies Co., Ltd. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * This is used to produce a jcod file in which we modify the + * NestMembers attribute to make it empty. The class + * HostNoNestMember$Member has a class HostNoNestMember as its + * NestHost, which will trigger an error when resolving . + */ +class HostNoNestMember { + class Member { + private int value; + } + + public int test() { + Member m = new Member(); + return m.value; + } +} diff --git a/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.jcod b/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.jcod index 66ea2f47a1050..a2cdeae3e7e1d 100644 --- a/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.jcod +++ b/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.jcod @@ -1,3 +1,28 @@ +/* + * Copyright (c) 2021, Huawei Technologies Co., Ltd. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// NestMembers attribute empty + class HostNoNestMember { 0xCAFEBABE; 0; // minor version @@ -23,7 +48,7 @@ class HostNoNestMember { Utf8 "HostNoNestMember"; // #17 Utf8 "Code"; // #18 Utf8 "LineNumberTable"; // #19 - Utf8 "foo"; // #20 + Utf8 "test"; // #20 Utf8 "()I"; // #21 Utf8 "SourceFile"; // #22 Utf8 "TestNestHostErrorWithMultiThread.java"; // #23 @@ -59,7 +84,7 @@ class HostNoNestMember { [] { // Attributes Attr(#19) { // LineNumberTable [] { // line_number_table - 0 3; + 0 44; } } // end LineNumberTable } // Attributes @@ -84,8 +109,8 @@ class HostNoNestMember { [] { // Attributes Attr(#19) { // LineNumberTable [] { // line_number_table - 0 9; - 9 10; + 0 50; + 9 51; } } // end LineNumberTable } // Attributes @@ -101,7 +126,7 @@ class HostNoNestMember { ; Attr(#24) { // NestMembers [] { // classes - // #7; delete NestMember + // #7; delete NestMember } } // end NestMembers ; diff --git a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java index c6d5924f4b4ca..a45e1daf56eea 100644 --- a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java +++ b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java @@ -27,7 +27,7 @@ * @summary JVM crashes when two threads encounter the same resolution error * * @library /test/lib - * @compile TestNestHostErrorWithMultiThread.java + * @compile HostNoNestMember.java * @compile HostNoNestMember.jcod * * @run main/othervm TestNestHostErrorWithMultiThread @@ -35,48 +35,48 @@ import java.util.concurrent.CountDownLatch; -class HostNoNestMember { - class Member { - private int value; - } +public class TestNestHostErrorWithMultiThread { - public int foo() { - Member m = new Member(); - return m.value; - } -} + public static void main(String args[]) { + CountDownLatch latch1 = new CountDownLatch(1); + CountDownLatch latch2 = new CountDownLatch(2); -public class TestNestHostErrorWithMultiThread { + new Thread(new Test(latch1, latch2)).start(); + new Thread(new Test(latch1, latch2)).start(); - public static void main(String args[]) throws Throwable { - TestNestHostErrorWithMultiThread t = new TestNestHostErrorWithMultiThread(); - t.test(); + try { + // waiting thread creation + latch2.await(); + latch1.countDown(); + } catch (InterruptedException e) {} } - public void test() throws Throwable { - - CountDownLatch latch = new CountDownLatch(1); + static class Test implements Runnable { + private CountDownLatch latch1; + private CountDownLatch latch2; - new Thread(() -> { - try { - latch.await(); - HostNoNestMember h = new HostNoNestMember(); - h.foo(); - } catch (IllegalAccessError expected) { - System.out.println("OK - got expected exception: " + expected); - } catch (InterruptedException e) {} - }).start(); + Test(CountDownLatch latch1, CountDownLatch latch2) { + this.latch1 = latch1; + this.latch2 = latch2; + } - new Thread(() -> { + @Override + public void run() { try { - latch.await(); + latch2.countDown(); + // Try to have all threads trigger the nesthost check at the same time + latch1.await(); HostNoNestMember h = new HostNoNestMember(); - h.foo(); + h.test(); } catch (IllegalAccessError expected) { + String msg = "current type is not listed as a nest member"; + if (!expected.getMessage().contains(msg)) { + throw new Error("Wrong " + expected.getClass().getSimpleName() +": \"" + + expected.getMessage() + "\" does not contain \"" + + msg + "\"", expected); + } System.out.println("OK - got expected exception: " + expected); } catch (InterruptedException e) {} - }).start(); - - latch.countDown(); + } } } From 7cd04c941748809d2086c6e7bf2eb1415eba8985 Mon Sep 17 00:00:00 2001 From: Wanghuang-Huawei Date: Wed, 28 Apr 2021 14:59:40 +0800 Subject: [PATCH 5/7] fix some bugs --- .../TestNestHostErrorWithMultiThread.java | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java index a45e1daf56eea..27ecfbf995242 100644 --- a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java +++ b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java @@ -26,11 +26,10 @@ * @bug 8264760 * @summary JVM crashes when two threads encounter the same resolution error * - * @library /test/lib * @compile HostNoNestMember.java * @compile HostNoNestMember.jcod * - * @run main/othervm TestNestHostErrorWithMultiThread + * @run main TestNestHostErrorWithMultiThread */ import java.util.concurrent.CountDownLatch; @@ -38,36 +37,41 @@ public class TestNestHostErrorWithMultiThread { public static void main(String args[]) { - CountDownLatch latch1 = new CountDownLatch(1); - CountDownLatch latch2 = new CountDownLatch(2); + CountDownLatch runLatch = new CountDownLatch(1); + CountDownLatch startLatch = new CountDownLatch(2); - new Thread(new Test(latch1, latch2)).start(); - new Thread(new Test(latch1, latch2)).start(); + Runnable test = new Test(runLatch, startLatch); + + new Thread(test).start(); + new Thread(test).start(); try { // waiting thread creation - latch2.await(); - latch1.countDown(); - } catch (InterruptedException e) {} + startLatch.await(); + runLatch.countDown(); + } catch (InterruptedException e) { + throw new Error("Unexpected interrupt"); + } } static class Test implements Runnable { - private CountDownLatch latch1; - private CountDownLatch latch2; + private CountDownLatch runLatch; + private CountDownLatch startLatch; - Test(CountDownLatch latch1, CountDownLatch latch2) { - this.latch1 = latch1; - this.latch2 = latch2; + Test(CountDownLatch runLatch, CountDownLatch startLatch) { + this.runLatch = runLatch; + this.startLatch = startLatch; } @Override public void run() { try { - latch2.countDown(); + startLatch.countDown(); // Try to have all threads trigger the nesthost check at the same time - latch1.await(); + runLatch.await(); HostNoNestMember h = new HostNoNestMember(); h.test(); + throw new Error("IllegalAccessError was not thrown as expected"); } catch (IllegalAccessError expected) { String msg = "current type is not listed as a nest member"; if (!expected.getMessage().contains(msg)) { @@ -76,7 +80,9 @@ public void run() { msg + "\"", expected); } System.out.println("OK - got expected exception: " + expected); - } catch (InterruptedException e) {} + } catch (InterruptedException e) { + throw new Error("Unexpected interrupt"); + } } } } From adaffaaca1c67c1512666a59ab5828f3290ce158 Mon Sep 17 00:00:00 2001 From: Wanghuang-Huawei Date: Fri, 30 Apr 2021 11:28:51 +0800 Subject: [PATCH 6/7] fix crash problem --- .../membership/TestNestHostErrorWithMultiThread.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java index 27ecfbf995242..82b0688117636 100644 --- a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java +++ b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java @@ -42,13 +42,19 @@ public static void main(String args[]) { Runnable test = new Test(runLatch, startLatch); - new Thread(test).start(); - new Thread(test).start(); + Thread t1 = new Thread(test); + Thread t2 = new Thread(test); + + t1.start(); + t2.start(); try { // waiting thread creation startLatch.await(); runLatch.countDown(); + + t1.join(); + t2.join(); } catch (InterruptedException e) { throw new Error("Unexpected interrupt"); } From ae957908884797b49eb8280eae15a847718b517b Mon Sep 17 00:00:00 2001 From: Wanghuang-Huawei Date: Thu, 6 May 2021 10:06:26 +0800 Subject: [PATCH 7/7] fix comments --- .../Nestmates/membership/HostNoNestMember.java | 12 ++++++++---- .../membership/TestNestHostErrorWithMultiThread.java | 4 ++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.java b/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.java index 2f919770de96f..58aa320156f9e 100644 --- a/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.java +++ b/test/hotspot/jtreg/runtime/Nestmates/membership/HostNoNestMember.java @@ -22,10 +22,14 @@ */ /* - * This is used to produce a jcod file in which we modify the - * NestMembers attribute to make it empty. The class - * HostNoNestMember$Member has a class HostNoNestMember as its - * NestHost, which will trigger an error when resolving . + * This class was used to produce a jcod file in which the + * NestMembers attribute was modified to make it empty. Class + * HostNoNestMember$Member has class HostNoNestMember as its + * NestHost, which will trigger an error when resolving. + * + * When compiled, this generates a HostNoNestMember class and + * a HostNoNestMember$Menber class. The former class, HostNoNestMember, + * gets overwritten when HostNoNestMember.jcod gets compiled. */ class HostNoNestMember { class Member { diff --git a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java index 82b0688117636..11025fd4c12e8 100644 --- a/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java +++ b/test/hotspot/jtreg/runtime/Nestmates/membership/TestNestHostErrorWithMultiThread.java @@ -32,6 +32,10 @@ * @run main TestNestHostErrorWithMultiThread */ +// HostNoNestMember.jcod must be compiled after HostNoNestMember.java +// because the class file from the jcod file must replace the +// HostNoNestMember class file generated from HostNoNestMember.java. + import java.util.concurrent.CountDownLatch; public class TestNestHostErrorWithMultiThread {