On Fri, 25 Oct 2024 18:36:50 GMT, Patricio Chilano Mateo
<[email protected]> wrote:
>> src/java.base/share/classes/java/lang/VirtualThread.java line 952:
>>
>>> 950: for (;;) {
>>> 951: boolean unblocked = false;
>>> 952: synchronized (timedWaitLock()) {
>>
>> Where is the overall design of the timed-wait protocol and it use of
>> synchronization described?
>
> When we unmount on a timed-wait call we schedule a wakeup task at the end of
> `afterYield`. There are two mechanisms that avoid the scheduled task to run
> and wake up the virtual thread on a future timed-wait call, since in this
> call the virtual thread could have been already notified before the scheduled
> task runs. The first one is to cancel the scheduled task once we return from
> the wait call (see `Object.wait(long timeoutMillis)`). Since the task could
> have been already started though, we also use `timedWaitSeqNo`, which the
> wake up task checks here to make sure it is not an old one. Since we
> synchronize on `timedWaitLock` to increment `timedWaitSeqNo` and change state
> to `TIMED_WAIT` before scheduling the wake up task in `afterYield`, here
> either a wrong `timedWaitSeqNo` or a state different than `TIMED_WAIT` means
> there is nothing to do. The only exception is checking for `SUSPENDED` state,
> in which case we just loop to retry.
Thanks for the explanation but that needs to be documented somewhere.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/21565#discussion_r1818228510