@@ -68,6 +68,7 @@ extern "C" {
68
68
#include " simplepool_api.h"
69
69
#include " SCStringInternHelpers.h"
70
70
#include < string.h>
71
+ #include " SCQueryFunctions.h"
71
72
#include " util_api.h"
72
73
}
73
74
@@ -412,6 +413,12 @@ static char* generateStartupHintsKey(J9JavaVM *vm);
412
413
static void fetchStartupHintsFromSharedCache (J9VMThread* vmThread);
413
414
static void findExistingCacheLayerNumbers (J9JavaVM* vm, const char * ctrlDirName, const char * cacheName, U_64 runtimeFlags, I_8 *maxLayerNo);
414
415
static IDATA sysinfoGetUserNameHelper (J9JavaVM *vm, UDATA verboseFlags, char *buffer, UDATA length);
416
+ static UDATA romToRamGetRomAddress (void *item);
417
+ static UDATA romToRamHashFn (void *item, void *userData);
418
+ static UDATA romToRamEqualFn (void *left, void *right, void *userData);
419
+ #if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
420
+ static void romToRamRemoveEntry (J9HookInterface **hookInterface, UDATA eventNum, void *voidData, void *userData);
421
+ #endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */
415
422
416
423
typedef struct J9SharedVerifyStringTable {
417
424
void *romClassAreaStart;
@@ -3183,6 +3190,49 @@ j9shr_isBCIEnabled(J9JavaVM *vm)
3183
3190
return (0 != (vm->sharedClassConfig ->runtimeFlags & J9SHR_RUNTIMEFLAG_ENABLE_BCI));
3184
3191
}
3185
3192
3193
+ static UDATA
3194
+ romToRamGetRomAddress (void *item)
3195
+ {
3196
+ RomToRamQueryEntry *queryEntry = (RomToRamQueryEntry *)item;
3197
+ UDATA romAddress = (UDATA)(queryEntry->romClass );
3198
+ if (J9_ARE_ALL_BITS_SET (romAddress, ROM_TO_RAM_QUERY_TAG)) {
3199
+ return romAddress & ~ROM_TO_RAM_QUERY_TAG;
3200
+ } else {
3201
+ RomToRamEntry *entry = (RomToRamEntry *)item;
3202
+ return (UDATA)(entry->ramClass ->romClass );
3203
+ }
3204
+ }
3205
+
3206
+ /* THREADING: Must be protected by J9SharedClassConfig.romToRamHashTableMutex */
3207
+ static UDATA
3208
+ romToRamHashFn (void *item, void *userData)
3209
+ {
3210
+ return romToRamGetRomAddress (item);
3211
+ }
3212
+
3213
+ /* THREADING: Must be protected by J9SharedClassConfig.romToRamHashTableMutex */
3214
+ static UDATA
3215
+ romToRamEqualFn (void *left, void *right, void *userData)
3216
+ {
3217
+ return (romToRamGetRomAddress (left) == romToRamGetRomAddress (right));
3218
+ }
3219
+
3220
+ #if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
3221
+ static void
3222
+ romToRamRemoveEntry (J9HookInterface **hookInterface, UDATA eventNum, void *voidData, void *userData)
3223
+ {
3224
+ J9VMClassesUnloadEvent *data = (J9VMClassesUnloadEvent *)voidData;
3225
+ J9SharedClassConfig *config = data->currentThread ->javaVM ->sharedClassConfig ;
3226
+ omrthread_rwmutex_enter_write (config->romToRamHashTableMutex );
3227
+ for (J9Class *ramClass = data->classesToUnload ; ramClass; ramClass = ramClass->gcLink ) {
3228
+ RomToRamEntry entry;
3229
+ entry.ramClass = ramClass;
3230
+ hashTableRemove (config->romToRamHashTable , &entry);
3231
+ }
3232
+ omrthread_rwmutex_exit_write (config->romToRamHashTableMutex );
3233
+ }
3234
+ #endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */
3235
+
3186
3236
/* *
3187
3237
* JVM Initialisation processing for shared classes
3188
3238
*
@@ -3207,7 +3257,7 @@ j9shr_init(J9JavaVM *vm, UDATA loadFlags, UDATA* nonfatal)
3207
3257
U_64 runtimeFlags = vm->sharedCacheAPI ->runtimeFlags ;
3208
3258
UDATA verboseFlags = vm->sharedCacheAPI ->verboseFlags ;
3209
3259
UDATA printStatsOptions = vm->sharedCacheAPI ->printStatsOptions ;
3210
- J9HookInterface** hook = vm->internalVMFunctions ->getVMHookInterface (vm);
3260
+ J9HookInterface** vmHooks = vm->internalVMFunctions ->getVMHookInterface (vm);
3211
3261
UDATA parseResult = vm->sharedCacheAPI ->parseResult ;
3212
3262
IDATA rc, rcStartup = 0 ;
3213
3263
const char * cacheName = vm->sharedCacheAPI ->cacheName ;
@@ -3515,6 +3565,24 @@ j9shr_init(J9JavaVM *vm, UDATA loadFlags, UDATA* nonfatal)
3515
3565
config->jclURLCache = NULL ;
3516
3566
config->jclURLHashTable = NULL ;
3517
3567
config->jclUTF8HashTable = NULL ;
3568
+ if (J9_ARE_ALL_BITS_SET (runtimeFlags, J9SHR_RUNTIMEFLAG_ENABLE_CACHE_NON_BOOT_CLASSES)) {
3569
+ if (omrthread_rwmutex_init (&(config->romToRamHashTableMutex ), 0 , " romToRamHashTable mutex" )) {
3570
+ SHRINIT_ERR_TRACE (verboseFlags, J9NLS_SHRC_SHRINIT_FAILURE_CREATE_ROMTORAMMUTEX);
3571
+ goto _error;
3572
+ }
3573
+ omrthread_rwmutex_enter_write (config->romToRamHashTableMutex );
3574
+ config->romToRamHashTable = hashTableNew (OMRPORT_FROM_J9PORT (vm->portLibrary ),
3575
+ J9_GET_CALLSITE (), 0 , sizeof (RomToRamEntry), sizeof (char *), 0 ,
3576
+ J9MEM_CATEGORY_CLASSES, romToRamHashFn, romToRamEqualFn, NULL , NULL );
3577
+ if (NULL == config->romToRamHashTable ) {
3578
+ omrthread_rwmutex_exit_write (config->romToRamHashTableMutex );
3579
+ omrthread_rwmutex_destroy (config->romToRamHashTableMutex );
3580
+ SHRINIT_ERR_TRACE (verboseFlags, J9NLS_SHRC_SHRINIT_FAILURE_CREATE_ROMTORAMHASHTABLE);
3581
+ goto _error;
3582
+ }
3583
+ omrthread_rwmutex_exit_write (config->romToRamHashTableMutex );
3584
+ }
3585
+
3518
3586
config->jclJ9ClassPathEntryPool = pool_new (sizeof (struct J9ClassPathEntry ), 0 , 0 , 0 , J9_GET_CALLSITE (), J9MEM_CATEGORY_CLASSES, POOL_FOR_PORT (vm->portLibrary ));
3519
3587
if (!(config->jclJ9ClassPathEntryPool )) {
3520
3588
SHRINIT_ERR_TRACE (verboseFlags, J9NLS_SHRC_SHRINIT_FAILURE_CREATE_POOL);
@@ -3556,7 +3624,7 @@ j9shr_init(J9JavaVM *vm, UDATA loadFlags, UDATA* nonfatal)
3556
3624
}
3557
3625
3558
3626
/* Register hooks */
3559
- (*hook )->J9HookRegisterWithCallSite (hook , J9HOOK_VM_FIND_LOCALLY_DEFINED_CLASS, hookFindSharedClass, OMR_GET_CALLSITE (), NULL );
3627
+ (*vmHooks )->J9HookRegisterWithCallSite (vmHooks , J9HOOK_VM_FIND_LOCALLY_DEFINED_CLASS, hookFindSharedClass, OMR_GET_CALLSITE (), NULL );
3560
3628
3561
3629
/* We don't need the string table when running with -Xshareclasses:print<XXXX>Stats.
3562
3630
* This is because the JVM is terminated, after displaying the requested information.
@@ -3710,10 +3778,13 @@ j9shr_init(J9JavaVM *vm, UDATA loadFlags, UDATA* nonfatal)
3710
3778
}
3711
3779
3712
3780
if (0 != (runtimeFlags & J9SHR_RUNTIMEFLAG_ADD_TEST_JITHINT)) {
3713
- J9HookInterface** hook = vm->internalVMFunctions ->getVMHookInterface (vm);
3714
- (*hook)->J9HookRegisterWithCallSite (hook, J9HOOK_VM_FIND_LOCALLY_DEFINED_CLASS, addTestJitHint, OMR_GET_CALLSITE (), NULL );
3781
+ (*vmHooks)->J9HookRegisterWithCallSite (vmHooks, J9HOOK_VM_FIND_LOCALLY_DEFINED_CLASS, addTestJitHint, OMR_GET_CALLSITE (), NULL );
3715
3782
}
3716
-
3783
+ #if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
3784
+ if (NULL != vm->sharedClassConfig ->romToRamHashTable ) {
3785
+ (*vmHooks)->J9HookRegisterWithCallSite (vmHooks, J9HOOK_VM_CLASSES_UNLOAD, romToRamRemoveEntry, OMR_GET_CALLSITE (), NULL );
3786
+ }
3787
+ #endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */
3717
3788
if (doPrintStats) {
3718
3789
if (j9shr_print_stats (vm, parseResult, runtimeFlags, printStatsOptions) != -1 ) {
3719
3790
*nonfatal = 0 ; /* Nonfatal should be ignored for stats utilities */
@@ -4137,6 +4208,11 @@ j9shr_guaranteed_exit(J9JavaVM *vm, BOOLEAN exitForDebug)
4137
4208
*/
4138
4209
J9HookInterface** hook = vm->internalVMFunctions ->getVMHookInterface (vm);
4139
4210
(*hook)->J9HookUnregister (hook, J9HOOK_VM_FIND_LOCALLY_DEFINED_CLASS, hookFindSharedClass, NULL );
4211
+ #if defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING)
4212
+ if (NULL != vm->sharedClassConfig ->romToRamHashTable ) {
4213
+ (*hook)->J9HookUnregister (hook, J9HOOK_VM_CLASSES_UNLOAD, romToRamRemoveEntry, NULL );
4214
+ }
4215
+ #endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */
4140
4216
J9HookInterface **shcHooks;
4141
4217
shcHooks = zip_getVMZipCachePoolHookInterface ((J9ZipCachePool *)vm->zipCachePool );
4142
4218
(*shcHooks)->J9HookUnregister (shcHooks, J9HOOK_VM_ZIP_LOAD, j9shr_hookZipLoadEvent, NULL );
@@ -4207,6 +4283,8 @@ j9shr_shutdown(J9JavaVM *vm)
4207
4283
J9SharedStringFarm* jclStringFarm = config->jclStringFarm ;
4208
4284
J9HashTable* urlHashTable = config->jclURLHashTable ;
4209
4285
J9HashTable* utfHashTable = config->jclUTF8HashTable ;
4286
+ J9HashTable *romToRamHashTable = config->romToRamHashTable ;
4287
+ omrthread_rwmutex_t romToRamHashTableMutex = config->romToRamHashTableMutex ;
4210
4288
J9VMThread* currentThread = vm->internalVMFunctions ->currentVMThread (vm);
4211
4289
4212
4290
/* Free all of the cached ClasspathItems */
@@ -4251,6 +4329,16 @@ j9shr_shutdown(J9JavaVM *vm)
4251
4329
if (utfHashTable) {
4252
4330
hashTableFree (utfHashTable);
4253
4331
}
4332
+ if (NULL != romToRamHashTable) {
4333
+ omrthread_rwmutex_enter_write (romToRamHashTableMutex);
4334
+ config->romToRamHashTable = NULL ;
4335
+ config->romToRamHashTableMutex = NULL ;
4336
+ if (romToRamHashTable) {
4337
+ hashTableFree (romToRamHashTable);
4338
+ }
4339
+ omrthread_rwmutex_exit_write (romToRamHashTableMutex);
4340
+ omrthread_rwmutex_destroy (romToRamHashTableMutex);
4341
+ }
4254
4342
4255
4343
/* Kill the string farm */
4256
4344
0 commit comments