Skip to content

Commit 845ef4e

Browse files
committed
Add check for live Vthreads in pinned checks
Signed-off-by: Tobi Ajila <atobia@ca.ibm.com>
1 parent 89cf06a commit 845ef4e

7 files changed

Lines changed: 24 additions & 14 deletions

File tree

runtime/oti/j9.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,14 @@ static_assert((LITERAL_STRLEN(J9_UNMODIFIABLE_CLASS_ANNOTATION) < (size_t)'/'),
450450
} while (0)
451451
#endif /* JAVA_SPEC_VERSION >= 24 */
452452

453+
#if JAVA_SPEC_VERSION >= 24
454+
#define J9VM_ARE_PINNED_YIELDABLE_VIRTUALTHREADS_ACTIVE(vm) \
455+
(J9_ARE_ANY_BITS_SET((vm)->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION) \
456+
&& J9_ARE_ANY_BITS_SET((vm)->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION))
457+
#else
458+
#define J9VM_ARE_PINNED_YIELDABLE_VIRTUALTHREADS_ACTIVE(vm) (1 == 0)
459+
#endif
460+
453461
#define DIR_LIB_STR "lib"
454462

455463
#if defined(J9VM_OPT_JFR)

runtime/oti/j9consts.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@ extern "C" {
391391
#define J9_EXTENDED_RUNTIME3_GCCONTAINERHEURISTICS 0x400
392392
#define J9_EXTENDED_RUNTIME3_USE_VECTOR_LENGTH_256 0x800
393393
#define J9_EXTENDED_RUNTIME3_USE_VECTOR_LENGTH_512 0x1000
394+
#define J9_EXTENDED_RUNTIME3_VTHREAD_CREATED 0x2000
394395

395396

396397
#define J9_OBJECT_HEADER_AGE_DEFAULT 0xA /* OBJECT_HEADER_AGE_DEFAULT */

runtime/vm/BytecodeInterpreter.hpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,14 +1207,11 @@ class INTERPRETER_CLASS
12071207
enterObjectMonitor(REGISTER_ARGS_LIST, j9object_t obj)
12081208
{
12091209
UDATA rc = (UDATA)obj;
1210-
#if JAVA_SPEC_VERSION >= 24
1211-
bool pinningSupportEnabled = J9_ARE_ANY_BITS_SET(_vm->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION);
1212-
#endif /* JAVA_SPEC_VERSION >= 24 */
12131210
if (!VM_ObjectMonitor::inlineFastObjectMonitorEnter(_currentThread, obj)) {
12141211
rc = objectMonitorEnterNonBlocking(_currentThread, obj);
12151212
if (J9_OBJECT_MONITOR_BLOCKING == rc) {
12161213
#if JAVA_SPEC_VERSION >= 24
1217-
if (pinningSupportEnabled && VM_ContinuationHelpers::isYieldableVirtualThread(_currentThread)) {
1214+
if (_pinningSupportEnabled && VM_ContinuationHelpers::isYieldableVirtualThread(_currentThread)) {
12181215
/* Try to yield the virtual thread if it will be blocked. */
12191216
updateVMStruct(REGISTER_ARGS);
12201217
rc = preparePinnedVirtualThreadForUnmount(_currentThread, obj, false);
@@ -1228,7 +1225,7 @@ class INTERPRETER_CLASS
12281225
}
12291226
}
12301227
#if JAVA_SPEC_VERSION >= 24
1231-
if (pinningSupportEnabled && (rc == (UDATA)obj)) {
1228+
if (_pinningSupportEnabled && (rc == (UDATA)obj)) {
12321229
J9VMContinuation *continuation = _currentThread->currentContinuation;
12331230
if (NULL != continuation) {
12341231
if (J9_ARE_ALL_BITS_SET(continuation->runtimeFlags, J9VM_CONTINUATION_RUNTIMEFLAG_JVMTI_CONTENDED_MONITOR_ENTER_RECORDED)) {
@@ -3044,7 +3041,7 @@ class INTERPRETER_CLASS
30443041
{
30453042
if (VM_ObjectMonitor::getMonitorForNotify(_currentThread, receiver, &monitorPtr, true)) {
30463043
#if JAVA_SPEC_VERSION >= 24
3047-
if (J9_ARE_ANY_BITS_SET(_vm->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION)) {
3044+
if (J9VM_ARE_PINNED_YIELDABLE_VIRTUALTHREADS_ACTIVE(_vm)) {
30483045
j9objectmonitor_t lock = 0;
30493046
j9objectmonitor_t *lockEA = NULL;
30503047
J9ObjectMonitor *objectMonitor = NULL;
@@ -6004,7 +6001,7 @@ class INTERPRETER_CLASS
60046001
buildInternalNativeStackFrame(REGISTER_ARGS);
60056002
updateVMStruct(REGISTER_ARGS);
60066003
#if JAVA_SPEC_VERSION >= 24
6007-
if (J9_ARE_ANY_BITS_SET(_vm->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION)
6004+
if (_pinningSupportEnabled)
60086005
&& (_currentThread->ownedMonitorCount > 0)
60096006
&& !isFinished
60106007
) {
@@ -10395,7 +10392,9 @@ class INTERPRETER_CLASS
1039510392
#if defined(LOCAL_LITERALS)
1039610393
J9Method *_literals = vmThread->literals;
1039710394
#endif
10398-
10395+
#if JAVA_SPEC_VERSION >= 24
10396+
const bool _pinningSupportEnabled = J9_ARE_ANY_BITS_SET(vmThread->javaVM->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION
10397+
#endif /* JAVA_SPEC_VERSION >= 24 */
1039910398
DEBUG_MUST_HAVE_VM_ACCESS(vmThread);
1040010399
vmThread->jitStackFrameFlags = 0;
1040110400

runtime/vm/ContinuationHelpers.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ createContinuation(J9VMThread *currentThread, j9object_t continuationObject)
4545
I_64 start = j9time_hires_clock();
4646
#endif /* defined(J9VM_PROF_CONTINUATION_ALLOCATION) */
4747

48+
vm->extendedRuntimeFlags3 |= J9_EXTENDED_RUNTIME3_VTHREAD_CREATED;
49+
4850
/* First check if local cache is available. */
4951
if (NULL != currentThread->continuationT1Cache) {
5052
for (U_32 i = 0; i < vm->continuationT1Size; i++) {

runtime/vm/FastJNI_java_lang_Object.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ Fast_java_lang_Object_notifyAll(J9VMThread *currentThread, j9object_t receiverOb
6262
if (VM_ObjectMonitor::getMonitorForNotify(currentThread, receiverObject, &monitorPtr, true)) {
6363
#if JAVA_SPEC_VERSION >= 24
6464
J9JavaVM *vm = currentThread->javaVM;
65-
if (J9_ARE_ANY_BITS_SET(vm->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION)) {
65+
if (J9VM_ARE_PINNED_YIELDABLE_VIRTUALTHREADS_ACTIVE(vm)) {
6666
j9objectmonitor_t lock = 0;
6767
j9objectmonitor_t *lockEA = NULL;
6868
J9ObjectMonitor *objectMonitor = NULL;
@@ -107,7 +107,7 @@ Fast_java_lang_Object_notify(J9VMThread *currentThread, j9object_t receiverObjec
107107
if (VM_ObjectMonitor::getMonitorForNotify(currentThread, receiverObject, &monitorPtr, true)) {
108108
#if JAVA_SPEC_VERSION >= 24
109109
J9JavaVM *vm = currentThread->javaVM;
110-
if (J9_ARE_ANY_BITS_SET(vm->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION)) {
110+
if (J9VM_ARE_PINNED_YIELDABLE_VIRTUALTHREADS_ACTIVE(vm)) {
111111
j9objectmonitor_t lock = 0;
112112
j9objectmonitor_t *lockEA = NULL;
113113
J9ObjectMonitor *objectMonitor = NULL;

runtime/vm/monhelpers.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ objectMonitorExit(J9VMThread* vmStruct, j9object_t object)
9999
#endif /* if !(defined(AIXPPC) || defined(LINUXPPC)) */
100100
#endif /* ifndef J9VM_THR_LOCK_RESERVATION */
101101
#if JAVA_SPEC_VERSION >= 24
102-
if (J9_ARE_ANY_BITS_SET(vm->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION)) {
102+
if (J9VM_ARE_PINNED_YIELDABLE_VIRTUALTHREADS_ACTIVE(vm)) {
103103
if (OBJECT_HEADER_LOCK_FLC == count) {
104104
/* FLC set, non-recursive. */
105105
J9ObjectMonitor *objectMonitor = objectMonitorInflate(vmStruct, object, lock);
@@ -115,7 +115,7 @@ objectMonitorExit(J9VMThread* vmStruct, j9object_t object)
115115

116116
omrthread_monitor_exit(monitor);
117117

118-
if (J9_ARE_ANY_BITS_SET(vm->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION)
118+
if (J9VM_ARE_PINNED_YIELDABLE_VIRTUALTHREADS_ACTIVE(vm)
119119
&& (0 != objectMonitor->virtualThreadWaitCount)
120120
) {
121121
J9VM_SEND_VIRTUAL_UNBLOCKER_THREAD_SIGNAL(vm);
@@ -314,7 +314,7 @@ objectMonitorExit(J9VMThread* vmStruct, j9object_t object)
314314
#endif /* JAVA_SPEC_VERSION >= 24 */
315315
rc = omrthread_monitor_exit((omrthread_monitor_t)monitor);
316316
#if JAVA_SPEC_VERSION >= 24
317-
if (J9_ARE_ANY_BITS_SET(vm->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION)
317+
if (J9VM_ARE_PINNED_YIELDABLE_VIRTUALTHREADS_ACTIVE(vm)
318318
&& (0 != objectMonitor->virtualThreadWaitCount)
319319
) {
320320
J9VM_SEND_VIRTUAL_UNBLOCKER_THREAD_SIGNAL(vm);

runtime/vm/threadhelp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ notifyUnblocker(void *userData)
465465
{
466466
J9VMThread *currentThread = (J9VMThread *)userData;
467467
J9JavaVM *vm = currentThread->javaVM;
468-
if (J9_ARE_ANY_BITS_SET(vm->extendedRuntimeFlags3, J9_EXTENDED_RUNTIME3_YIELD_PINNED_CONTINUATION)) {
468+
if (J9VM_ARE_PINNED_YIELDABLE_VIRTUALTHREADS_ACTIVE(vm)) {
469469
J9VM_SEND_VIRTUAL_UNBLOCKER_THREAD_SIGNAL(vm);
470470
Trc_VM_ThreadHelp_notifyUnblocker(currentThread);
471471
}

0 commit comments

Comments
 (0)