Skip to content

Commit cc3d0b3

Browse files
authored
Merge pull request #19864 from babsingh/v0.47.0-release
(0.47) Update Thread.interrupted in JVMTI RawMonitorWait
2 parents cbc9332 + 9b76196 commit cc3d0b3

File tree

2 files changed

+46
-7
lines changed

2 files changed

+46
-7
lines changed

runtime/jvmti/jvmtiRawMonitor.c

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,51 @@ jvmtiRawMonitorWait(jvmtiEnv *env,
259259
break;
260260
case J9THREAD_INTERRUPTED:
261261
/* FALLTHROUGH*/
262-
case J9THREAD_PRIORITY_INTERRUPTED:
262+
case J9THREAD_PRIORITY_INTERRUPTED: {
263+
#if JAVA_SPEC_VERSION >= 19
264+
J9InternalVMFunctions const * const vmFuncs = vm->internalVMFunctions;
265+
j9object_t threadObject = NULL;
266+
j9object_t threadLock = NULL;
267+
268+
vmFuncs->internalEnterVMFromJNI(currentThread);
269+
270+
threadObject = currentThread->threadObject;
271+
Assert_JVMTI_true(NULL != threadObject);
272+
273+
threadLock = J9VMJAVALANGTHREAD_LOCK(currentThread, threadObject);
274+
threadLock = (j9object_t)vmFuncs->objectMonitorEnter(currentThread, threadLock);
275+
276+
if (J9_OBJECT_MONITOR_ENTER_FAILED(threadLock)) {
277+
#if defined(J9VM_OPT_CRIU_SUPPORT)
278+
if (J9_OBJECT_MONITOR_CRIU_SINGLE_THREAD_MODE_THROW == (UDATA)threadLock) {
279+
vmFuncs->setCRIUSingleThreadModeJVMCRIUException(currentThread, 0, 0);
280+
rc = JVMTI_ERROR_INTERNAL;
281+
} else
282+
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
283+
if (J9_OBJECT_MONITOR_OOM == (UDATA)threadLock) {
284+
rc = JVMTI_ERROR_OUT_OF_MEMORY;
285+
}
286+
goto release;
287+
} else {
288+
/* Refetch J9VMThread->threadObject as it can be moved by the GC while waiting for the monitor. */
289+
threadObject = currentThread->threadObject;
290+
if (J9VMJAVALANGTHREAD_DEADINTERRUPT(currentThread, threadObject)) {
291+
J9VMJAVALANGTHREAD_SET_DEADINTERRUPT(currentThread, threadObject, JNI_FALSE);
292+
if (IS_JAVA_LANG_VIRTUALTHREAD(currentThread, threadObject)) {
293+
J9VMJAVALANGTHREAD_SET_DEADINTERRUPT(currentThread, currentThread->carrierThreadObject, JNI_FALSE);
294+
}
295+
}
296+
vmFuncs->objectMonitorExit(currentThread, threadLock);
297+
}
298+
263299
rc = JVMTI_ERROR_INTERRUPT;
300+
release:
301+
vmFuncs->internalExitVMToJNI(currentThread);
302+
#else /* JAVA_SPEC_VERSION >= 19 */
303+
rc = JVMTI_ERROR_INTERRUPT;
304+
#endif /* JAVA_SPEC_VERSION >= 19 */
264305
break;
306+
}
265307
case J9THREAD_INVALID_ARGUMENT:
266308
rc = JVMTI_ERROR_INTERRUPT;
267309
break;
@@ -343,6 +385,3 @@ jvmtiRawMonitorNotifyAll(jvmtiEnv* env,
343385
done:
344386
TRACE_JVMTI_RETURN(jvmtiRawMonitorNotifyAll);
345387
}
346-
347-
348-

runtime/jvmti/jvmtiThreadGroup.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ getThreadGroupChildrenImpl(J9JavaVM *vm, J9VMThread *currentThread, jobject grou
240240
#if defined(J9VM_OPT_CRIU_SUPPORT)
241241
if (J9_OBJECT_MONITOR_CRIU_SINGLE_THREAD_MODE_THROW == (UDATA)childrenGroupsLock) {
242242
vmFuncs->setCRIUSingleThreadModeJVMCRIUException(currentThread, 0, 0);
243-
rc = JVMTI_ERROR_THREAD_SUSPENDED;
243+
rc = JVMTI_ERROR_INTERNAL;
244244
} else
245245
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
246246
if (J9_OBJECT_MONITOR_OOM == (UDATA)childrenGroupsLock) {
@@ -276,7 +276,7 @@ getThreadGroupChildrenImpl(J9JavaVM *vm, J9VMThread *currentThread, jobject grou
276276
#if defined(J9VM_OPT_CRIU_SUPPORT)
277277
if (J9_OBJECT_MONITOR_CRIU_SINGLE_THREAD_MODE_THROW == (UDATA)childrenThreadsLock) {
278278
vmFuncs->setCRIUSingleThreadModeJVMCRIUException(currentThread, 0, 0);
279-
rc = JVMTI_ERROR_THREAD_SUSPENDED;
279+
rc = JVMTI_ERROR_INTERNAL;
280280
} else
281281
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
282282
if (J9_OBJECT_MONITOR_OOM == (UDATA)childrenThreadsLock) {
@@ -347,7 +347,7 @@ getThreadGroupChildrenImpl(J9JavaVM *vm, J9VMThread *currentThread, jobject grou
347347
#if defined(J9VM_OPT_CRIU_SUPPORT)
348348
if (J9_OBJECT_MONITOR_CRIU_SINGLE_THREAD_MODE_THROW == (UDATA)threadGroupObject) {
349349
vmFuncs->setCRIUSingleThreadModeJVMCRIUException(currentThread, 0, 0);
350-
rc = JVMTI_ERROR_THREAD_SUSPENDED;
350+
rc = JVMTI_ERROR_INTERNAL;
351351
} else
352352
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
353353
if (J9_OBJECT_MONITOR_OOM == (UDATA)threadGroupObject) {

0 commit comments

Comments
 (0)