Skip to content

Commit 7d8e108

Browse files
authored
Merge pull request eclipse-openj9#19857 from tajila/asgct
Clear jni ids on anonClass unload
2 parents 29635ce + ece537e commit 7d8e108

File tree

4 files changed

+34
-22
lines changed

4 files changed

+34
-22
lines changed

runtime/oti/j9.h

+5
Original file line numberDiff line numberDiff line change
@@ -416,4 +416,9 @@ static_assert((LITERAL_STRLEN(J9_UNMODIFIABLE_CLASS_ANNOTATION) < (size_t)'/'),
416416
#endif /* __cplusplus */
417417
#endif /* 0 */
418418

419+
#define J9VM_NUM_OF_ENTRIES_IN_CLASS_JNIID_TABLE(romclass) ((romclass)->romMethodCount + (romclass)->romFieldCount)
420+
421+
#define J9VM_SHOULD_CLEAR_JNIIDS_FOR_ASGCT(vm, classLoader) (J9_ARE_NO_BITS_SET((vm)->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_NEVER_KEEP_JNI_IDS) \
422+
&& ((classLoader)->asyncGetCallTraceUsed || J9_ARE_ANY_BITS_SET((vm)->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_ALWAYS_KEEP_JNI_IDS)))
423+
419424
#endif /* J9_H */

runtime/vm/classallocation.c

+5-7
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ allocateClassLoader(J9JavaVM *javaVM)
208208
}
209209

210210

211-
void
211+
void
212212
freeClassLoader(J9ClassLoader *classLoader, J9JavaVM *javaVM, J9VMThread *vmThread, UDATA needsFrameBuild)
213213
{
214214
#ifdef J9VM_GC_DYNAMIC_CLASS_UNLOADING
@@ -259,7 +259,7 @@ freeClassLoader(J9ClassLoader *classLoader, J9JavaVM *javaVM, J9VMThread *vmThre
259259
classLoader->hotFieldPoolMutex = NULL;
260260
}
261261
}
262-
262+
263263
/* free the class path entries allocated for system and non-system class loaders */
264264
if (javaVM->systemClassLoader == classLoader) {
265265
if (NULL != classLoader->classPathEntries) {
@@ -300,7 +300,7 @@ freeClassLoader(J9ClassLoader *classLoader, J9JavaVM *javaVM, J9VMThread *vmThre
300300
if (NULL != nativeLibrary) {
301301
Assert_VM_mustHaveVMAccess(vmThread);
302302
}
303-
303+
304304
while (NULL != nativeLibrary) {
305305
BOOLEAN unloadPerformed = FALSE;
306306

@@ -385,9 +385,7 @@ freeClassLoader(J9ClassLoader *classLoader, J9JavaVM *javaVM, J9VMThread *vmThre
385385
}
386386

387387
if (NULL != classLoader->jniIDs) {
388-
if (J9_ARE_NO_BITS_SET(javaVM->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_NEVER_KEEP_JNI_IDS)
389-
&& (classLoader->asyncGetCallTraceUsed || J9_ARE_ANY_BITS_SET(javaVM->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_ALWAYS_KEEP_JNI_IDS))
390-
) {
388+
if (J9VM_SHOULD_CLEAR_JNIIDS_FOR_ASGCT(javaVM, classLoader)) {
391389
pool_state idWalkState;
392390
J9GenericJNIID *jniID = pool_startDo(classLoader->jniIDs, &idWalkState);
393391

@@ -419,7 +417,7 @@ freeClassLoader(J9ClassLoader *classLoader, J9JavaVM *javaVM, J9VMThread *vmThre
419417
moduleExtraInfoPtr = (J9ModuleExtraInfo *)hashTableNextDo(&moduleExtraInfoWalkState);
420418
}
421419
hashTableFree(classLoader->moduleExtraInfoHashTable);
422-
classLoader->moduleExtraInfoHashTable = NULL;
420+
classLoader->moduleExtraInfoHashTable = NULL;
423421
}
424422
if (NULL != classLoader->classLocationHashTable) {
425423
hashTableFree(classLoader->classLocationHashTable);

runtime/vm/jnicsup.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ JNICALL throwNew(JNIEnv *env, jclass clazz, const char *message)
383383
{
384384
jmethodID constructor;
385385
jobject throwable;
386-
386+
387387
if (message) {
388388
jstring messageObject;
389389
constructor = getMethodID(env, clazz, "<init>", "(Ljava/lang/String;)V");
@@ -470,7 +470,7 @@ void JNICALL gpCheckInitialize(J9VMThread* env, J9Class* clazz)
470470

471471

472472

473-
void
473+
void
474474
gpCheckCallin(JNIEnv *env, jobject receiver, jclass cls, jmethodID methodID, void* args)
475475
{
476476
J9RedirectedCallInArgs handlerArgs;
@@ -1882,9 +1882,9 @@ getMethodOrFieldID(JNIEnv *env, jclass classReference, const char *name, const c
18821882
UDATA inconsistentData = 0;
18831883
id = getJNIFieldID(vmThread, declaringClass, (J9ROMFieldShape *) element, offset, &inconsistentData);
18841884
if (0 != inconsistentData) {
1885-
/* declaringClass->romClass & element are inconsistent due to
1885+
/* declaringClass->romClass & element are inconsistent due to
18861886
* class redefinition. Retry the operation and hope a redefinition
1887-
* doesn't occur again
1887+
* doesn't occur again
18881888
*/
18891889
goto retry;
18901890
}
@@ -2056,8 +2056,8 @@ monitorEnter(JNIEnv* env, jobject obj)
20562056
#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)
20572057
if (J9_IS_J9CLASS_VALUETYPE(badClass)) {
20582058
setCurrentExceptionNLSWithArgs(vmThread, J9NLS_VM_ERROR_BYTECODE_OBJECTREF_CANNOT_BE_VALUE_TYPE, J9VMCONSTANTPOOL_JAVALANGIDENTITYEXCEPTION, J9UTF8_LENGTH(badClassName), J9UTF8_DATA(badClassName));
2059-
} else
2060-
#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */
2059+
} else
2060+
#endif /* defined(J9VM_OPT_VALHALLA_VALUE_TYPES) */
20612061
{
20622062
Assert_VM_true(J9_ARE_ALL_BITS_SET(vmThread->javaVM->extendedRuntimeFlags2, J9_EXTENDED_RUNTIME2_VALUE_BASED_EXCEPTION));
20632063
setCurrentExceptionNLSWithArgs(vmThread, J9NLS_VM_ERROR_BYTECODE_OBJECTREF_CANNOT_BE_VALUE_BASED, J9VMCONSTANTPOOL_JAVALANGVIRTUALMACHINEERROR, J9UTF8_LENGTH(badClassName), J9UTF8_DATA(badClassName));
@@ -2159,7 +2159,7 @@ ensureJNIIDTable(J9VMThread *currentThread, J9Class* clazz)
21592159
jniIDs = clazz->jniIDs;
21602160
if (jniIDs == NULL) {
21612161
J9ROMClass * romclass = clazz->romClass;
2162-
UDATA size = (romclass->romMethodCount + romclass->romFieldCount) * sizeof(void *);
2162+
UDATA size = J9VM_NUM_OF_ENTRIES_IN_CLASS_JNIID_TABLE(romclass) * sizeof(void *);
21632163

21642164
jniIDs = (void**)j9mem_allocate_memory(size, J9MEM_CATEGORY_JNI);
21652165
if (jniIDs != NULL) {
@@ -2470,7 +2470,7 @@ getModule(JNIEnv *env, jclass clazz)
24702470
{
24712471
J9VMThread *vmThread = (J9VMThread *) env;
24722472
jobject module = NULL;
2473-
2473+
24742474
VM_VMAccess::inlineEnterVMFromJNI(vmThread);
24752475
if (NULL == clazz) {
24762476
setCurrentExceptionUTF(vmThread, J9VMCONSTANTPOOL_JAVALANGNULLPOINTEREXCEPTION, NULL);
@@ -2688,7 +2688,7 @@ defineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsi
26882688
}
26892689
}
26902690
}
2691-
2691+
26922692
result = (jclass)VM_VMHelpers::createLocalRef(env, J9VM_J9CLASS_TO_HEAPCLASS(clazz));
26932693
}
26942694

runtime/vm/jvminit.c

+15-6
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,7 @@ void sidecarExit(J9VMThread* shutdownThread);
233233
static jint runLoadStage (J9JavaVM *vm, IDATA flags);
234234
#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
235235
static void freeClassNativeMemory (J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
236-
#if JAVA_SPEC_VERSION >= 22
237236
static void vmHookAnonClassesUnload(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData);
238-
#endif /* JAVA_SPEC_VERSION >= 22 */
239237
#endif /* GC_DYNAMIC_CLASS_UNLOADING */
240238
static jint runShutdownStage (J9JavaVM* vm, IDATA stage, void* reserved, UDATA filterFlags);
241239
static jint modifyDllLoadTable (J9JavaVM * vm, J9Pool* loadTable, J9VMInitArgs* j9vm_args);
@@ -7533,9 +7531,7 @@ protectedInitializeJavaVM(J9PortLibrary* portLibrary, void * userData)
75337531
#if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
75347532
vmHooks = getVMHookInterface(vm);
75357533
if(0 != (*vmHooks)->J9HookRegisterWithCallSite(vmHooks, J9HOOK_VM_CLASS_UNLOAD, freeClassNativeMemory, OMR_GET_CALLSITE(), NULL)
7536-
#if JAVA_SPEC_VERSION >= 22
75377534
|| 0 != (*vmHooks)->J9HookRegisterWithCallSite(vmHooks, J9HOOK_VM_ANON_CLASSES_UNLOAD, vmHookAnonClassesUnload, OMR_GET_CALLSITE(), NULL)
7538-
#endif /* JAVA_SPEC_VERSION >= 22 */
75397535
) {
75407536
goto error;
75417537
}
@@ -8157,17 +8153,30 @@ freeClassNativeMemory(J9HookInterface** hook, UDATA eventNum, void* eventData, v
81578153
#endif /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */
81588154
}
81598155

8160-
#if JAVA_SPEC_VERSION >= 22
8156+
81618157
static void
81628158
vmHookAnonClassesUnload(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)
81638159
{
81648160
J9VMAnonymousClassesUnloadEvent * unloadedEvent = (J9VMAnonymousClassesUnloadEvent *)eventData;
81658161
J9VMThread * vmThread = unloadedEvent->currentThread;
8162+
J9JavaVM *vm = vmThread->javaVM;
81668163
for (J9Class* j9clazz = unloadedEvent->anonymousClassesToUnload; j9clazz; j9clazz = j9clazz->gcLink) {
8164+
/* AnonClass->classLoader points to the hostclass->classLoader not the anonClassLoader. */
8165+
if (J9VM_SHOULD_CLEAR_JNIIDS_FOR_ASGCT(vm, j9clazz->classLoader)) {
8166+
void **jniIDs = j9clazz->jniIDs;
8167+
if (NULL != jniIDs) {
8168+
UDATA size = J9VM_NUM_OF_ENTRIES_IN_CLASS_JNIID_TABLE(j9clazz->romClass);
8169+
for (UDATA i = 0; i < size; i++) {
8170+
J9GenericJNIID *id = (J9GenericJNIID*)(jniIDs[i]);
8171+
memset(id, -1, sizeof(J9GenericJNIID));
8172+
}
8173+
}
8174+
}
8175+
#if JAVA_SPEC_VERSION >= 22
81678176
hashClassTablePackageDelete(vmThread, j9clazz->classLoader, j9clazz->romClass);
8177+
#endif /* JAVA_SPEC_VERSION >= 22 */
81688178
}
81698179
}
8170-
#endif /* JAVA_SPEC_VERSION >= 22 */
81718180

81728181
#endif /* GC_DYNAMIC_CLASS_UNLOADING */
81738182

0 commit comments

Comments
 (0)