On Tue, 9 Mar 2021 05:42:05 GMT, Yasumasa Suenaga <ysuen...@openjdk.org> wrote:
>> Many tests run `LingeredApp`, get its stack with `jstack`, and then look for >> `LingeredApp.main` in the output, which should appear in the stack trace of >> the main thread. Usually this works fine since the main thread is in a loop, >> and usually blocked in `Thread.sleep()`. However, during the short period of >> time it wakes up from sleep, the thread's stack might not be walk-able, in >> which case the `LingeredApp.main` frame will not appear, and the tests >> looking for it will fail. >> >> The fix is to introduce a new thread called `SteadyStateThread` that has a >> method called `steadyState()` that blocks indefinitely trying to synchronize >> on a locked object. All code that used to look for `LingeredApp.main` in the >> output now instead looks for `LingeredApp.steadyState`, which should always >> be there. I'm open to suggestions for a better name than "SteadyState" if >> you have one. >> >> There are a few special cases with the tests that were modified that are >> described below: >> >> Regarding the removal of `LingeredAppWithTrivialMain.java`, it was >> originally added to fix >> [JDK-8229118](https://bugs.openjdk.java.net/browse/JDK-8229118), which was >> an issue with the `ClhsdbFindPC` test failing on aarch64 when doing the >> `-Xcomp` run. It expected `LingeredApp.main()` to be compiled in that case, >> and for the PC of the frame to be in an `NMethod`. However, on aarch64 an >> uncommon-trap was causing it to be de-optimized, so the PC was in the >> interpreter instead, causing the test to fail. The fix was to instead rely >> on finding a trivial `LingeredAppWithTrivialMain.main()` frame in the stack >> trace since it would always be compiled. With the changes to instead have >> (and rely on) the `SteadyStateThread` and the presence of >> `LingeredApp.steadyState()`, the need for `LingeredAppWithTrivialMain` goes >> away. `LingeredApp.steadyState()` will always be compiled, even on aarch64. >> >> Regarding `DebugdConnectTest.java`, it is listed in the CR as an affected >> test but no specified fix has been provided. >> None is needed. The issue was that it looked for `LingeredApp` in the >> jstack output, and it used to be the only place it would find it was in the >> main thread's stack trace, which sometimes could not be retrieved. Now it >> can also be found in the `SteadyStateThread`'s stack trace, which can always >> be retrieved. >> >> Regarding `HeapDumpTest.java`, it used to check for >> `LingeredAppWithExtendedChars.main` and now it checks for >> `LingeredApp.steadyState`. It still is run with >> `LingeredAppWithExtendedChars`. The only thing special about that class is >> that it contains an extended unicode character used to reproduce >> [JDK-8028623](https://bugs.openjdk.java.net/browse/JDK-8028623), so it will >> still do that, even though it now checks for `LingeredApp.steadyState`. > > test/lib/jdk/test/lib/apps/LingeredApp.java line 531: > >> 529: // although this probably is not necessary to guarantee >> that the >> 530: // stack trace is readable. >> 531: Thread.sleep(100); > > Can we wait to change the state of `steadyStateThread` to `BLOCKED`? It is > more robustness than `Thread.sleep(100)`. How do you do that? ------------- PR: https://git.openjdk.java.net/jdk/pull/2700