Please review the following patch. This fixes a bug in how we handle state 
changes for the timed `Object.wait` case in `afterYield`, which can leave a 
virtual thread stuck in the `BLOCKED` state. It can be triggered by two 
consecutive calls to timed `Object.wait`, if the first call receives a 
notification and the second call relies on the timeout task to wake up the 
thread. I added the full sequence of events that leads to the vthread getting 
stuck in JBS.

The fix is to check for `notified` and attempt to change the state to `BLOCKED` 
inside the synchronized block. This guarantees that we don't change the state 
of an already new timed `Object.wait` call.

The PR includes a new test which reproduces the issue when run several times in 
mach5. It's a hybrid of my original repro test and another one created by 
@AlanBateman.

Thanks,
Patricio

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

Commit messages:
 - v1

Changes: https://git.openjdk.org/jdk/pull/29255/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=29255&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8373120
  Stats: 147 lines in 2 files changed: 136 ins; 8 del; 3 mod
  Patch: https://git.openjdk.org/jdk/pull/29255.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/29255/head:pull/29255

PR: https://git.openjdk.org/jdk/pull/29255

Reply via email to