On Wed, 7 Jun 2023 23:17:18 GMT, Chris Plummer <cjplum...@openjdk.org> wrote:
> The test waits for a ThreadDeathEvent for "main". Once that arrives, it then > waits for the next ThreadStartEvent (for any thread). Once it arrives, the > test tries to create and enable a StepRequest on the "main" thread. Since > "main" is supposedly dead, the expectation is an IllegalThreadStateException. > However, it turns out that sometimes the enabling can in fact succeed. > > Just because a ThreadDeathEvent has been received for a thread does not mean > you can no longer do things with the thread like suspend it or enable a > StepEvent. There is a short delay in the debug agent after sending the > ThreadDeathEvent before it stops tracking the thread. The thread can still be > acted upon until then. The JDWP and JDI specs seem to support doing this: > >> Notification of a completed thread in the target VM. The notification is >> generated by the dying thread before it terminates. Because of this timing, >> it is possible for {@link VirtualMachine#allThreads} to return this thread >> after this event is received. >> >> Note that this event gives no information about the lifetime of the thread >> object. It may or may not be collected soon depending on what references >> exist in the target VM. > > What this means is that when the test receives some arbitrary > ThreadStartEvent after the "main" ThreadDeathEvent has been received, the > test may in fact still be able to enable a StepRequest on the "main" thread, > causing the test to fail. What seems to trigger the failure is receiving an > unexpected spurious ThreadStartEvent such as from the Common-Clean thread or > a carrier thread, although even then it only fails some of the time. In fact > if I modify the test to enable the StepRequest when it receives the > ThreadDeathEvent for "main", it still almost always passes, but will fail > more frequently than it normally does. > > It seems if the test always waits for the ThreadStartEvent for > "DestroyJavaVM", then the "main" thread is truly gone by then and the test > always passes, so this is how I've chosen to fix the issue. > > Tested with tier1, tier2 svc tests, and tier5 svc tests. I think it makes sense! ------------- Marked as reviewed by kevinw (Committer). PR Review: https://git.openjdk.org/jdk/pull/14372#pullrequestreview-1470630717