@@ -69,12 +69,13 @@ 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);
78+ static void jfrClassInitialize (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
7879
7980static void
8081freeThreadIDs (J9VMThread *currentThread)
@@ -1152,6 +1153,7 @@ stopJFRRecording(J9JavaVM *vm)
11521153 (*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_MONITOR_CONTENDED_ENTERED , jfrVMMonitorEntered, NULL );
11531154 (*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_UNPARKED , jfrVMThreadParked, NULL );
11541155 (*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_SYSTEM_GC_CALLED , jfrSystemGC, NULL );
1156+
11551157 /* Deregister GC-related hooks via gc_base */
11561158 vm->memoryManagerFunctions ->j9gc_deregister_jfr_hooks (vm);
11571159}
@@ -1707,13 +1709,25 @@ getTypeId(J9VMThread *currentThread, J9Class *clazz)
17071709}
17081710
17091711static jlong
1710- getTypeIdImpl (J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *className, BOOLEAN freeName)
1712+ getTypeIdImpl (J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *className, BOOLEAN freeName, J9Class *clazz )
17111713{
17121714 J9JavaVM *vm = currentThread->javaVM ;
17131715 jlong result = INVALID_TYPE_ID ;
17141716 J9JFRTypeID entry = {0 };
17151717 J9JFRTypeID *jfrTypeID = &entry;
17161718
1719+ if (NULL != clazz) {
1720+ if (NULL == vm->jfrState .jfrEventClassRef ) {
1721+ return -1 ;
1722+ }
1723+ J9Class *eventClass = J9VMJAVALANGCLASS_VMREF (currentThread, J9_JNI_UNWRAP_REFERENCE (vm->jfrState .jfrEventClassRef ));
1724+ if (!isSameOrSuperClassOf (eventClass, clazz)
1725+ || J9_ARE_NO_BITS_SET (clazz->romClass ->modifiers , J9AccAbstract)
1726+ ) {
1727+ return -1 ;
1728+ }
1729+ }
1730+
17171731 Assert_VM_mustHaveVMAccess (currentThread);
17181732
17191733 omrthread_monitor_enter (vm->jfrState .typeIDMonitor );
@@ -1739,7 +1753,6 @@ getTypeIdImpl(J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *cla
17391753 setNativeOutOfMemoryError (currentThread, 0 , 0 );
17401754 goto done;
17411755 }
1742- classLoader->typeIDs = typeIDTable;
17431756
17441757#if JAVA_SPEC_VERSION >= 17
17451758 if (vm->systemClassLoader == classLoader) {
@@ -1760,6 +1773,8 @@ getTypeIdImpl(J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *cla
17601773 }
17611774 }
17621775#endif /* JAVA_SPEC_VERSION >= 17 */
1776+
1777+ classLoader->typeIDs = typeIDTable;
17631778 }
17641779
17651780 jfrTypeID->className = className;
@@ -1770,6 +1785,8 @@ getTypeIdImpl(J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *cla
17701785 jfrTypeID = &entry;
17711786 jfrTypeID->id = vm->jfrState .typeIDcount ;
17721787 jfrTypeID->free = freeName;
1788+ jfrTypeID->isEvent = FALSE ;
1789+ jfrTypeID->eventClass = NULL ;
17731790
17741791 vm->jfrState .typeIDcount += 1 ;
17751792 Assert_VM_true (vm->jfrState .typeIDcount > 0 );
@@ -1779,6 +1796,9 @@ getTypeIdImpl(J9VMThread *currentThread, J9ClassLoader *classLoader, J9UTF8 *cla
17791796 setNativeOutOfMemoryError (currentThread, 0 , 0 );
17801797 goto done;
17811798 }
1799+ } else if (NULL != clazz) {
1800+ jfrTypeID->isEvent = TRUE ;
1801+ jfrTypeID->eventClass = clazz;
17821802 }
17831803 result = jfrTypeID->id ;
17841804
@@ -1802,6 +1822,12 @@ initializeJFRv2(J9JavaVM *vm)
18021822 goto done;
18031823 }
18041824
1825+ if (J9_ARE_ALL_BITS_SET (vm->extendedRuntimeFlags3 , J9_EXTENDED_RUNTIME3_JFR_V2_SUPPORT )) {
1826+ if ((*vmHooks)->J9HookRegisterWithCallSite (vmHooks, J9HOOK_VM_CLASS_INITIALIZE , jfrClassInitialize, OMR_GET_CALLSITE (), NULL )) {
1827+ goto done;
1828+ }
1829+ }
1830+
18051831 if (0 != initializeJFRIDs (vm)) {
18061832 goto done;
18071833 }
@@ -1853,6 +1879,9 @@ jfrShutdownInternalStructures(J9HookInterface **hook, UDATA eventNum, void *even
18531879 internalReleaseVMAccess (currentThread);
18541880 vm->jfrState .jfrEventClassRef = NULL ;
18551881 vm->jfrState .jfrInternalEventClassRef = NULL ;
1882+ if (J9_ARE_ALL_BITS_SET (vm->extendedRuntimeFlags3 , J9_EXTENDED_RUNTIME3_JFR_V2_SUPPORT )) {
1883+ (*hook)->J9HookUnregister (hook, J9HOOK_VM_CLASS_INITIALIZE , jfrClassInitialize, NULL );
1884+ }
18561885}
18571886
18581887static void
@@ -2017,6 +2046,8 @@ addType(J9JavaVM *vm, const char *eventOrTypeName, UDATA id, bool isEvent)
20172046 entry.id = id;
20182047 entry.className = className;
20192048 entry.free = TRUE ;
2049+ entry.isEvent = isEvent;
2050+ entry.eventClass = NULL ;
20202051
20212052 /* Add to hash table */
20222053 if (NULL == hashTableAdd (typeIDTable, &entry)) {
@@ -2332,6 +2363,17 @@ requestJFREvent(J9VMThread *currentThread, jlong id)
23322363#endif /* JAVA_SPEC_VERSION >= 17 */
23332364}
23342365
2366+ void
2367+ jfrClassInitialize (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData)
2368+ {
2369+ J9VMClassInitializeEvent *event = (J9VMClassInitializeEvent *)eventData;
2370+ J9VMThread *currentThread = event->currentThread ;
2371+ J9Class *clazz = event->clazz ;
2372+
2373+ /* getTypeIdImpl will add clazz to the TypeID table. */
2374+ getTypeIdImpl (currentThread, clazz->classLoader , J9ROMCLASS_CLASSNAME (clazz->romClass ), FALSE , clazz);
2375+ }
2376+
23352377} /* extern "C" */
23362378
23372379#endif /* defined(J9VM_OPT_JFR) */
0 commit comments