@@ -69,14 +69,15 @@ static int J9THREAD_PROC jfrSamplingThreadProc(void *entryArg);
6969static void jfrExecutionSampleCallback (J9VMThread *currentThread, IDATA handlerKey, void *userData);
7070static void jfrThreadCPULoadCallback (J9VMThread *currentThread, IDATA handlerKey, void *userData);
7171static void jfrCheckJFRCMDLineOptions (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
72- static jlong getTypeIdImpl (J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *className, BOOLEAN freeName);
72+ static jlong getTypeIdImpl (J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *className, BOOLEAN freeName, J9Class *clazz = NULL );
7373#if JAVA_SPEC_VERSION >= 17
7474static bool addEventIds (J9JavaVM *vm);
7575static bool addTypeIds (J9JavaVM *vm);
7676#endif /* JAVA_SPEC_VERSION >= 17 */
7777static void jfrShutdownInternalStructures (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
7878static void notifyForChunkRotation (J9VMThread *currentThread);
7979static void checkAvailableSpaceInGlobalBuffer (J9VMThread *currentThread);
80+ static void jfrClassInitialize (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
8081
8182static void
8283freeThreadIDs (J9VMThread *currentThread)
@@ -1159,6 +1160,7 @@ stopJFRRecording(J9JavaVM *vm)
11591160 (*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_MONITOR_CONTENDED_ENTERED , jfrVMMonitorEntered, NULL );
11601161 (*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_UNPARKED , jfrVMThreadParked, NULL );
11611162 (*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_SYSTEM_GC_CALLED , jfrSystemGC, NULL );
1163+
11621164 /* Deregister GC-related hooks via gc_base */
11631165 vm->memoryManagerFunctions ->j9gc_deregister_jfr_hooks (vm);
11641166}
@@ -1717,13 +1719,25 @@ getTypeId(J9VMThread *currentThread, J9Class *clazz)
17171719}
17181720
17191721static jlong
1720- getTypeIdImpl (J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *className, BOOLEAN freeName)
1722+ getTypeIdImpl (J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *className, BOOLEAN freeName, J9Class *clazz )
17211723{
17221724 J9JavaVM *vm = currentThread->javaVM ;
17231725 jlong result = INVALID_TYPE_ID ;
17241726 J9JFRTypeID entry = {0 };
17251727 J9JFRTypeID *jfrTypeID = &entry;
17261728
1729+ if (NULL != clazz) {
1730+ if (NULL == vm->jfrState .jfrEventClassRef ) {
1731+ return -1 ;
1732+ }
1733+ J9Class *eventClass = J9VMJAVALANGCLASS_VMREF (currentThread, J9_JNI_UNWRAP_REFERENCE (vm->jfrState .jfrEventClassRef ));
1734+ if (!isSameOrSuperClassOf (eventClass, clazz)
1735+ || J9_ARE_NO_BITS_SET (clazz->romClass ->modifiers , J9AccAbstract)
1736+ ) {
1737+ return -1 ;
1738+ }
1739+ }
1740+
17271741 Assert_VM_mustHaveVMAccess (currentThread);
17281742
17291743 omrthread_monitor_enter (vm->jfrState .typeIDMonitor );
@@ -1770,6 +1784,8 @@ getTypeIdImpl(J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *cla
17701784 }
17711785 }
17721786#endif /* JAVA_SPEC_VERSION >= 17 */
1787+
1788+ classLoader->typeIDs = typeIDTable;
17731789 }
17741790
17751791 jfrTypeID->className = className;
@@ -1780,6 +1796,8 @@ getTypeIdImpl(J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *cla
17801796 jfrTypeID = &entry;
17811797 jfrTypeID->id = vm->jfrState .typeIDcount ;
17821798 jfrTypeID->free = freeName;
1799+ jfrTypeID->isEvent = FALSE ;
1800+ jfrTypeID->eventClass = NULL ;
17831801
17841802 vm->jfrState .typeIDcount += 1 ;
17851803 Assert_VM_true (vm->jfrState .typeIDcount > 0 );
@@ -1789,6 +1807,9 @@ getTypeIdImpl(J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *cla
17891807 setNativeOutOfMemoryError (currentThread, 0 , 0 );
17901808 goto done;
17911809 }
1810+ } else if (NULL != clazz) {
1811+ jfrTypeID->isEvent = TRUE ;
1812+ jfrTypeID->eventClass = clazz;
17921813 }
17931814 result = jfrTypeID->id ;
17941815
@@ -1812,6 +1833,12 @@ initializeJFRv2(J9JavaVM *vm)
18121833 goto done;
18131834 }
18141835
1836+ if (J9_ARE_ALL_BITS_SET (vm->extendedRuntimeFlags3 , J9_EXTENDED_RUNTIME3_JFR_V2_SUPPORT )) {
1837+ if ((*vmHooks)->J9HookRegisterWithCallSite (vmHooks, J9HOOK_VM_CLASS_INITIALIZE , jfrClassInitialize, OMR_GET_CALLSITE (), NULL )) {
1838+ goto done;
1839+ }
1840+ }
1841+
18151842 if (0 != initializeJFRIDs (vm)) {
18161843 goto done;
18171844 }
@@ -1865,6 +1892,9 @@ jfrShutdownInternalStructures(J9HookInterface **hook, UDATA eventNum, void *even
18651892 vm->jfrState .jfrEventClassRef = NULL ;
18661893 vm->jfrState .jfrInternalEventClassRef = NULL ;
18671894 vm->jfrState .chunkRotationMonitor = NULL ;
1895+ if (J9_ARE_ALL_BITS_SET (vm->extendedRuntimeFlags3 , J9_EXTENDED_RUNTIME3_JFR_V2_SUPPORT )) {
1896+ (*hook)->J9HookUnregister (hook, J9HOOK_VM_CLASS_INITIALIZE , jfrClassInitialize, NULL );
1897+ }
18681898}
18691899
18701900static void
@@ -2029,6 +2059,8 @@ addType(J9JavaVM *vm, const char *eventOrTypeName, UDATA id, bool isEvent)
20292059 entry.id = id;
20302060 entry.className = className;
20312061 entry.free = TRUE ;
2062+ entry.isEvent = isEvent;
2063+ entry.eventClass = NULL ;
20322064
20332065 /* Add to hash table */
20342066 if (NULL == hashTableAdd (typeIDTable, &entry)) {
@@ -2402,6 +2434,17 @@ checkAvailableSpaceInGlobalBuffer(J9VMThread *currentThread)
24022434 }
24032435}
24042436
2437+ void
2438+ jfrClassInitialize (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData)
2439+ {
2440+ J9VMClassInitializeEvent *event = (J9VMClassInitializeEvent *)eventData;
2441+ J9VMThread *currentThread = event->currentThread ;
2442+ J9Class *clazz = event->clazz ;
2443+
2444+ /* getTypeIdImpl will add clazz to the TypeID table. */
2445+ getTypeIdImpl (currentThread, clazz->classLoader , J9ROMCLASS_CLASSNAME (clazz->romClass ), FALSE , clazz);
2446+ }
2447+
24052448} /* extern "C" */
24062449
24072450#endif /* defined(J9VM_OPT_JFR) */
0 commit comments