@@ -53,6 +53,7 @@ static void jfrThreadStarting(J9HookInterface **hook, UDATA eventNum, void *even
53
53
static void jfrThreadEnd (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
54
54
static void jfrVMInitialized (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
55
55
static void jfrVMMonitorWaited (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
56
+ static void jfrVMThreadParked (J9HookInterface **hook, UDATA eventNum, void *eventData, void *userData);
56
57
static void jfrStartSamplingThread (J9JavaVM *vm);
57
58
static void initializeEventFields (J9VMThread *currentThread, J9JFREvent *jfrEvent, UDATA eventType);
58
59
static int J9THREAD_PROC jfrSamplingThreadProc (void *entryArg);
@@ -87,6 +88,9 @@ jfrEventSize(J9JFREvent *jfrEvent)
87
88
case J9JFR_EVENT_TYPE_OBJECT_WAIT:
88
89
size = sizeof (J9JFRMonitorWaited) + (((J9JFRMonitorWaited*)jfrEvent)->stackTraceSize * sizeof (UDATA));
89
90
break ;
91
+ case J9JFR_EVENT_TYPE_THREAD_PARK:
92
+ size = sizeof (J9JFRThreadParked) + (((J9JFRThreadParked*)jfrEvent)->stackTraceSize * sizeof (UDATA));
93
+ break ;
90
94
case J9JFR_EVENT_TYPE_CPU_LOAD:
91
95
size = sizeof (J9JFRCPULoad);
92
96
break ;
@@ -638,6 +642,36 @@ jfrVMMonitorWaited(J9HookInterface **hook, UDATA eventNum, void *eventData, void
638
642
}
639
643
}
640
644
645
+ /* *
646
+ * Hook for VM thread parked. Called without VM access.
647
+ *
648
+ * @param hook[in] the VM hook interface
649
+ * @param eventNum[in] the event number
650
+ * @param eventData[in] the event data
651
+ * @param userData[in] the registered user data
652
+ */
653
+ static void
654
+ jfrVMThreadParked (J9HookInterface **hook, UDATA eventNum, void *eventData, void * userData)
655
+ {
656
+ J9VMUnparkedEvent *event = (J9VMUnparkedEvent *)eventData;
657
+ J9VMThread *currentThread = event->currentThread ;
658
+ PORT_ACCESS_FROM_VMC (currentThread);
659
+
660
+ #if defined(DEBUG)
661
+ j9tty_printf (PORTLIB, " \n !!! thread park %p\n " , currentThread);
662
+ #endif /* defined(DEBUG) */
663
+
664
+ J9JFRThreadParked *jfrEvent = (J9JFRThreadParked*)reserveBufferWithStackTrace (currentThread, currentThread, J9JFR_EVENT_TYPE_THREAD_PARK, sizeof (*jfrEvent));
665
+ if (NULL != jfrEvent) {
666
+ // TODO: worry about overflow?
667
+ jfrEvent->time = (event->millis * 1000000 ) + event->nanos ;
668
+ jfrEvent->duration = j9time_nano_time () - event->startTicks ;
669
+ jfrEvent->parkedAddress = event->parkedAddress ;
670
+ jfrEvent->parkedClass = event->parkedClass ;
671
+ }
672
+ }
673
+
674
+
641
675
jint
642
676
initializeJFR (J9JavaVM *vm, BOOLEAN lateInit)
643
677
{
@@ -691,6 +725,10 @@ initializeJFR(J9JavaVM *vm, BOOLEAN lateInit)
691
725
goto fail;
692
726
}
693
727
728
+ if ((*vmHooks)->J9HookRegisterWithCallSite (vmHooks, J9HOOK_VM_UNPARKED, jfrVMThreadParked, OMR_GET_CALLSITE (), NULL )) {
729
+ goto fail;
730
+ }
731
+
694
732
/* Allocate constantEvents. */
695
733
vm->jfrState .constantEvents = j9mem_allocate_memory (sizeof (JFRConstantEvents), J9MEM_CATEGORY_VM);
696
734
if (NULL == vm->jfrState .constantEvents ) {
@@ -821,6 +859,7 @@ tearDownJFR(J9JavaVM *vm)
821
859
/* Unregister it anyway even it wasn't registered for initializeJFR(vm, TRUE). */
822
860
(*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_INITIALIZED, jfrVMInitialized, NULL );
823
861
(*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_MONITOR_WAITED, jfrVMMonitorWaited, NULL );
862
+ (*vmHooks)->J9HookUnregister (vmHooks, J9HOOK_VM_UNPARKED, jfrVMThreadParked, NULL );
824
863
825
864
/* Free global data */
826
865
VM_JFRConstantPoolTypes::freeJFRConstantEvents (vm);
0 commit comments