From 767a9d89b1f977da06945388620593f0c7ae27a8 Mon Sep 17 00:00:00 2001 From: Nathan Henderson Date: Thu, 19 Dec 2024 12:26:03 -0800 Subject: [PATCH] Properly initialize the extensionClassLoader from the VM snapshot This patch properly initializes the extensionClassLoader on restore runs through the paths in BytecodeInterpreter.hpp and FastJNI_com_ibm_oti_vm_VM.cpp rather than, incorrectly, allocating a new class loader. Fixes: eclipse-openj9/openj9#20861 Signed-off-by: Nathan Henderson --- runtime/vm/BytecodeInterpreter.hpp | 25 +++++++++++++++--------- runtime/vm/FastJNI_com_ibm_oti_vm_VM.cpp | 15 ++++++++++---- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/runtime/vm/BytecodeInterpreter.hpp b/runtime/vm/BytecodeInterpreter.hpp index f61601104ba..e6a7aeaa91e 100644 --- a/runtime/vm/BytecodeInterpreter.hpp +++ b/runtime/vm/BytecodeInterpreter.hpp @@ -4748,15 +4748,22 @@ class INTERPRETER_CLASS allClassesEndDo(&classWalkState); } else { updateVMStruct(REGISTER_ARGS); - J9ClassLoader* result = internalAllocateClassLoader(_vm, classLoaderObject); - VMStructHasBeenUpdated(REGISTER_ARGS); // likely unnecessary - no code runs in internalAllocateClassLoader - if (NULL == result) { - rc = GOTO_THROW_CURRENT_EXCEPTION; - goto done; - } - if (J9_CLASSLOADER_TYPE_PLATFORM == loaderType) { - /* extensionClassLoader holds the platform class loader in Java 11+ */ - _vm->extensionClassLoader = result; +#if defined(J9VM_OPT_SNAPSHOTS) + if (IS_RESTORE_RUN(_vm) && (J9_CLASSLOADER_TYPE_PLATFORM == loaderType)) { + _vm->internalVMFunctions->initializeSnapshotClassLoaderObject(_vm, _vm->extensionClassLoader, classLoaderObject); + } else +#endif /* defined(J9VM_OPT_SNAPSHOTS) */ + { + J9ClassLoader *result = internalAllocateClassLoader(_vm, classLoaderObject); + VMStructHasBeenUpdated(REGISTER_ARGS); // likely unnecessary - no code runs in internalAllocateClassLoader + if (NULL == result) { + rc = GOTO_THROW_CURRENT_EXCEPTION; + goto done; + } + if (J9_CLASSLOADER_TYPE_PLATFORM == loaderType) { + /* extensionClassLoader holds the platform class loader in Java 11+ */ + _vm->extensionClassLoader = result; + } } } restoreInternalNativeStackFrame(REGISTER_ARGS); diff --git a/runtime/vm/FastJNI_com_ibm_oti_vm_VM.cpp b/runtime/vm/FastJNI_com_ibm_oti_vm_VM.cpp index 0422bb718ec..8a546ccd92d 100644 --- a/runtime/vm/FastJNI_com_ibm_oti_vm_VM.cpp +++ b/runtime/vm/FastJNI_com_ibm_oti_vm_VM.cpp @@ -140,10 +140,17 @@ Fast_com_ibm_oti_vm_VM_initializeClassLoader(J9VMThread *currentThread, j9object } allClassesEndDo(&classWalkState); } else { - J9ClassLoader *classLoaderStruct = internalAllocateClassLoader(vm, classLoaderObject); - if (J9_CLASSLOADER_TYPE_PLATFORM == loaderType) { - /* extensionClassLoader holds the platform class loader in Java 11+ */ - vm->extensionClassLoader = classLoaderStruct; +#if defined(J9VM_OPT_SNAPSHOTS) + if (IS_RESTORE_RUN(vm) && (J9_CLASSLOADER_TYPE_PLATFORM == loaderType)) { + vm->internalVMFunctions->initializeSnapshotClassLoaderObject(vm, vm->extensionClassLoader, classLoaderObject); + } else +#endif /* defined(J9VM_OPT_SNAPSHOTS) */ + { + J9ClassLoader *classLoaderStruct = internalAllocateClassLoader(vm, classLoaderObject); + if (J9_CLASSLOADER_TYPE_PLATFORM == loaderType) { + /* extensionClassLoader holds the platform class loader in Java 11+ */ + vm->extensionClassLoader = classLoaderStruct; + } } } }