Skip to content

Commit 2ca8224

Browse files
authored
Merge pull request #21774 from fengxue-IS/21183
Account for VirtualThread's SUSPENDED bit flag during transition
2 parents 39b3281 + a1e57f7 commit 2ca8224

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

runtime/oti/ContinuationHelpers.hpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -360,18 +360,25 @@ class VM_ContinuationHelpers {
360360
omrthread_monitor_enter(vm->blockedVirtualThreadsMutex);
361361
J9VMContinuation **link = &objectMonitor->waitingContinuations;
362362
J9VMContinuation *current = NULL;
363+
j9object_t vthread = NULL;
363364

364365
while (NULL != *link) {
365366
current = *link;
366-
if (J9VMJAVALANGTHREAD_DEADINTERRUPT(vmThread, current->vthread)) {
367+
vthread = current->vthread;
368+
if (J9VMJAVALANGTHREAD_DEADINTERRUPT(vmThread, vthread)) {
367369
/* Remove virtual threads that have been interrupted. */
368370
*link = current->nextWaitingContinuation;
369371
current->nextWaitingContinuation = NULL;
370372
} else {
371373
/* Set the notified and onWaitingList flags for virtual threads that have not been interrupted. */
372-
J9VMJAVALANGVIRTUALTHREAD_SET_NOTIFIED(vmThread, current->vthread, JNI_TRUE);
373-
/* Update the thread state to BLOCKED. */
374-
J9VMJAVALANGVIRTUALTHREAD_SET_STATE(vmThread, current->vthread, JAVA_LANG_VIRTUALTHREAD_BLOCKED);
374+
J9VMJAVALANGVIRTUALTHREAD_SET_NOTIFIED(vmThread, vthread, JNI_TRUE);
375+
376+
U_32 state = J9VMJAVALANGVIRTUALTHREAD_STATE(vmThread, vthread);
377+
if ((JAVA_LANG_VIRTUALTHREAD_WAIT == state) || (JAVA_LANG_VIRTUALTHREAD_TIMED_WAIT == state)) {
378+
/* Update the thread state to BLOCKED. */
379+
J9VMJAVALANGVIRTUALTHREAD_SET_STATE(vmThread, vthread, JAVA_LANG_VIRTUALTHREAD_BLOCKED);
380+
}
381+
375382
current->objectWaitMonitor->virtualThreadWaitCount += 1;
376383
notified = true;
377384

runtime/oti/j9nonbuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ typedef void(*j9_tls_finalizer_t)(void *);
310310
#define JAVA_LANG_VIRTUALTHREAD_WAIT 16
311311
#define JAVA_LANG_VIRTUALTHREAD_TIMED_WAITING 17
312312
#define JAVA_LANG_VIRTUALTHREAD_TIMED_WAIT 18
313+
#define JAVA_LANG_VIRTUALTHREAD_SUSPENDED (1 << 8)
313314
#endif /* JAVA_SPEC_VERSION >= 24 */
314315

315316
typedef enum {

runtime/vm/ContinuationHelpers.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,9 +1227,16 @@ takeVirtualThreadListToUnblock(J9VMThread *currentThread)
12271227
break;
12281228
}
12291229
default:
1230-
/* Thread must be unblocked by AfterYield(), hence it can only be UNBLOCKED or RUNNING. */
1231-
Assert_VM_true((JAVA_LANG_VIRTUALTHREAD_RUNNING == state) || (JAVA_LANG_VIRTUALTHREAD_UNBLOCKED == state));
1230+
{
1231+
if (J9_ARE_ANY_BITS_SET(state, JAVA_LANG_VIRTUALTHREAD_SUSPENDED)) {
1232+
J9VMJAVALANGVIRTUALTHREAD_SET_BLOCKPERMIT(currentThread, current->vthread, JNI_TRUE);
1233+
} else {
1234+
/* Thread must be unblocked by AfterYield(), hence it can only be UNBLOCKED or RUNNING. */
1235+
Assert_VM_true((JAVA_LANG_VIRTUALTHREAD_RUNNING == state) || (JAVA_LANG_VIRTUALTHREAD_UNBLOCKED == state));
1236+
}
1237+
break;
12321238
}
1239+
} /* switch (state) */
12331240

12341241
if (unblocked) {
12351242
/* Add to Java unblock list. */

0 commit comments

Comments
 (0)