@@ -155,6 +155,24 @@ static BOOLEAN shouldPostEvent(J9VMThread *currentThread, J9Method *method);
155
155
#if defined(J9VM_OPT_CRIU_SUPPORT )
156
156
static void jvmtiHookVMCheckpoint (J9HookInterface * * hook , UDATA eventNum , void * eventData , void * userData );
157
157
static void jvmtiHookVMRestore (J9HookInterface * * hook , UDATA eventNum , void * eventData , void * userData );
158
+ static void jvmtiHookVMRestoreCRIUInit (J9HookInterface * * hook , UDATA eventNum , void * eventData , void * userData );
159
+ static void jvmtiHookVMRestoreStartAgent (J9HookInterface * * hook , UDATA eventNum , void * eventData , void * userData );
160
+ static void hookDisableHelper (J9JavaVM * vm , J9HookInterface * * vmHook , UDATA eventNum , J9HookFunction function , BOOLEAN unreserve , void * userData );
161
+
162
+ static void
163
+ hookDisableHelper (J9JavaVM * vm , J9HookInterface * * vmHook , UDATA eventNum , J9HookFunction function , BOOLEAN unreserve , void * userData )
164
+ {
165
+ if (NULL == userData ) {
166
+ (* vmHook )-> J9HookUnregister (vmHook , eventNum , function , vm -> checkpointState .jvmtienv );
167
+ } else {
168
+ (* vmHook )-> J9HookUnregister (vmHook , eventNum , function , userData );
169
+ }
170
+ if (unreserve ) {
171
+ /* for actual hookRegister calls */
172
+ (* vmHook )-> J9HookUnreserve (vmHook , eventNum );
173
+ }
174
+ (* vmHook )-> J9HookDisable (vmHook , eventNum );
175
+ }
158
176
#endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
159
177
160
178
static void
@@ -539,6 +557,37 @@ jvmtiHookVMCheckpoint(J9HookInterface **hook, UDATA eventNum, void *eventData, v
539
557
TRACE_JVMTI_EVENT_RETURN (jvmtiHookVMCheckpoint );
540
558
}
541
559
560
+ static void
561
+ jvmtiHookVMRestoreCRIUInit (J9HookInterface * * hook , UDATA eventNum , void * eventData , void * userData )
562
+ {
563
+ Trc_JVMTI_jvmtiHookVMRestoreCRIUInit_Entry ();
564
+ criuRestoreInitializeLib (((J9RestoreEvent * )eventData )-> currentThread -> javaVM , (J9JVMTIEnv * )userData );
565
+ TRACE_JVMTI_EVENT_RETURN (jvmtiHookVMRestoreCRIUInit );
566
+ }
567
+
568
+ static void
569
+ jvmtiHookVMRestoreStartAgent (J9HookInterface * * hook , UDATA eventNum , void * eventData , void * userData )
570
+ {
571
+ J9VMThread * currentThread = ((J9RestoreEvent * )eventData )-> currentThread ;
572
+ J9JavaVM * vm = currentThread -> javaVM ;
573
+ Trc_JVMTI_jvmtiHookVMRestoreStartAgent_Entry ();
574
+ if (J9_ARE_ANY_BITS_SET (vm -> checkpointState .flags , J9VM_CRIU_IS_JDWP_ENABLED )) {
575
+ J9InternalVMFunctions const * const vmFuncs = vm -> internalVMFunctions ;
576
+
577
+ vmFuncs -> internalExitVMToJNI (currentThread );
578
+ criuRestoreStartAgent (vm );
579
+ vmFuncs -> internalEnterVMFromJNI (currentThread );
580
+ } else {
581
+ /* Last part of cleanup if there was no JDWP agent specified.
582
+ * This releases VM access hence can't be invoked within criuDisableHooks() from
583
+ * J9HOOK_VM_PREPARING_FOR_RESTORE.
584
+ */
585
+ jvmtiEnv * jvmti_env = vm -> checkpointState .jvmtienv ;
586
+ (* jvmti_env )-> DisposeEnvironment (jvmti_env );
587
+ }
588
+ TRACE_JVMTI_EVENT_RETURN (jvmtiHookVMRestoreStartAgent );
589
+ }
590
+
542
591
static void
543
592
jvmtiHookVMRestore (J9HookInterface * * hook , UDATA eventNum , void * eventData , void * userData )
544
593
{
@@ -562,6 +611,89 @@ jvmtiHookVMRestore(J9HookInterface **hook, UDATA eventNum, void *eventData, void
562
611
563
612
TRACE_JVMTI_EVENT_RETURN (jvmtiHookVMRestore );
564
613
}
614
+
615
+ void
616
+ criuDisableHooks (J9JVMTIData * jvmtiData , J9JVMTIEnv * j9env )
617
+ {
618
+ J9JavaVM * vm = jvmtiData -> vm ;
619
+ jvmtiEnv * jvmti_env = vm -> checkpointState .jvmtienv ;
620
+ J9HookInterface * * vmHook = vm -> internalVMFunctions -> getVMHookInterface (vm );
621
+
622
+ Assert_JVMTI_true (J9_ARE_NO_BITS_SET (vm -> checkpointState .flags , J9VM_CRIU_IS_JDWP_ENABLED ));
623
+
624
+ /* can_access_local_variables, can_get_source_file_name, can_get_line_numbers, can_get_source_debug_extension
625
+ * can_maintain_original_method_order, can_generate_single_step_events
626
+ */
627
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_REQUIRED_DEBUG_ATTRIBUTES , jvmtiHookRequiredDebugAttributes , FALSE, NULL );
628
+ vm -> requiredDebugAttributes &= ~J9VM_DEBUG_ATTRIBUTE_CAN_ACCESS_LOCALS ;
629
+ vm -> requiredDebugAttributes &= ~J9VM_DEBUG_ATTRIBUTE_MAINTAIN_ORIGINAL_METHOD_ORDER ;
630
+ vm -> requiredDebugAttributes &= ~J9VM_DEBUG_ATTRIBUTE_SOURCE_DEBUG_EXTENSION ;
631
+ if (NULL != vm -> jitConfig ) {
632
+ vm -> requiredDebugAttributes &= ~J9VM_DEBUG_ATTRIBUTE_LINE_NUMBER_TABLE ;
633
+ vm -> requiredDebugAttributes &= ~J9VM_DEBUG_ATTRIBUTE_LOCAL_VARIABLE_TABLE ;
634
+ vm -> requiredDebugAttributes &= ~J9VM_DEBUG_ATTRIBUTE_SOURCE_FILE ;
635
+ }
636
+
637
+ if (NULL != vm -> jitConfig ) {
638
+ J9VMHookInterface vmhookInterface = vm -> hookInterface ;
639
+
640
+ /* can_tag_objects */
641
+ hookDisableHelper (vm , vmHook , J9HOOK_MM_OMR_GLOBAL_GC_END , jvmtiHookGCEnd , FALSE, NULL );
642
+ hookDisableHelper (vm , vmHook , J9HOOK_MM_OMR_LOCAL_GC_END , jvmtiHookGCEnd , FALSE, NULL );
643
+
644
+ /* can_generate_single_step_events */
645
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_SINGLE_STEP , jvmtiHookSingleStep , FALSE, NULL );
646
+
647
+ /* can_generate_exception_events */
648
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_EXCEPTION_THROW , jvmtiHookExceptionThrow , TRUE, NULL );
649
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_EXCEPTION_CATCH , jvmtiHookExceptionCatch , TRUE, NULL );
650
+
651
+ /* can_generate_frame_pop_events */
652
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_FRAME_POP , jvmtiHookFramePop , FALSE, NULL );
653
+
654
+ /* can_generate_breakpoint_events */
655
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_BREAKPOINT , jvmtiHookBreakpoint , TRUE, NULL );
656
+
657
+ /* can_generate_method_entry_events */
658
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_METHOD_ENTER , jvmtiHookMethodEnter , TRUE, NULL );
659
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_NATIVE_METHOD_ENTER , jvmtiHookMethodEnter , TRUE, NULL );
660
+
661
+ /* can_generate_method_exit_events */
662
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_METHOD_RETURN , jvmtiHookMethodExit , TRUE, NULL );
663
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_NATIVE_METHOD_RETURN , jvmtiHookMethodExit , TRUE, NULL );
664
+
665
+ /* can_generate_monitor_events */
666
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_MONITOR_CONTENDED_ENTER , jvmtiHookMonitorContendedEnter , FALSE, NULL );
667
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_MONITOR_CONTENDED_ENTERED , jvmtiHookMonitorContendedEntered , FALSE, NULL );
668
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_MONITOR_WAIT , jvmtiHookMonitorWait , FALSE, NULL );
669
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_MONITOR_WAITED , jvmtiHookMonitorWaited , FALSE, NULL );
670
+
671
+ /* can_generate_garbage_collection_events */
672
+ hookDisableHelper (vm , vmHook , J9HOOK_MM_OMR_GLOBAL_GC_START , jvmtiHookGCStart , FALSE, NULL );
673
+ hookDisableHelper (vm , vmHook , J9HOOK_MM_OMR_LOCAL_GC_START , jvmtiHookGCStart , FALSE, NULL );
674
+
675
+ #if JAVA_SPEC_VERSION >= 21
676
+ /* can_support_virtual_threads */
677
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_VIRTUAL_THREAD_STARTED , jvmtiHookVirtualThreadStarted , FALSE, NULL );
678
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_VIRTUAL_THREAD_END , jvmtiHookVirtualThreadEnd , FALSE, NULL );
679
+ #endif /* JAVA_SPEC_VERSION >= 21 */
680
+
681
+ /* can_generate_field_modification_events */
682
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_PUT_FIELD , jvmtiHookFieldModification , FALSE, NULL );
683
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_PUT_STATIC_FIELD , jvmtiHookFieldModification , FALSE, NULL );
684
+
685
+ /* can_generate_field_access_events */
686
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_GET_FIELD , jvmtiHookFieldAccess , FALSE, NULL );
687
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_GET_STATIC_FIELD , jvmtiHookFieldAccess , FALSE, NULL );
688
+
689
+ /* can_pop_frame & can_force_early_return */
690
+ if (J9_EVENT_IS_HOOKED_OR_RESERVED (vmhookInterface , J9HOOK_VM_POP_FRAMES_INTERRUPT )) {
691
+ hookDisableHelper (vm , vmHook , J9HOOK_VM_POP_FRAMES_INTERRUPT , jvmtiHookPopFramesInterrupt , TRUE, J9JVMTI_DATA_FROM_VM (vm ));
692
+ }
693
+ }
694
+
695
+ (* jvmti_env )-> RelinquishCapabilities (jvmti_env , & vm -> checkpointState .requiredCapabilities );
696
+ }
565
697
#endif /* defined(J9VM_OPT_CRIU_SUPPORT)*/
566
698
567
699
static IDATA
@@ -1914,6 +2046,17 @@ hookGlobalEvents(J9JVMTIData * jvmtiData)
1914
2046
return 1 ;
1915
2047
}
1916
2048
2049
+ #if defined(J9VM_OPT_CRIU_SUPPORT )
2050
+ if (vm -> internalVMFunctions -> isDebugOnRestoreEnabled (vm -> mainThread )) {
2051
+ if ((* vmHook )-> J9HookRegisterWithCallSite (vmHook , J9HOOK_TAG_AGENT_ID | J9HOOK_VM_PREPARING_FOR_RESTORE , jvmtiHookVMRestoreCRIUInit , OMR_GET_CALLSITE (), jvmtiData , J9HOOK_AGENTID_FIRST )) {
2052
+ return 1 ;
2053
+ }
2054
+ if ((* vmHook )-> J9HookRegisterWithCallSite (vmHook , J9HOOK_TAG_AGENT_ID | J9HOOK_VM_CRIU_RESTORE , jvmtiHookVMRestoreStartAgent , OMR_GET_CALLSITE (), jvmtiData , J9HOOK_AGENTID_FIRST )) {
2055
+ return 1 ;
2056
+ }
2057
+ }
2058
+ #endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
2059
+
1917
2060
if ((* vmHook )-> J9HookRegisterWithCallSite (vmHook , J9HOOK_TAG_AGENT_ID | J9HOOK_VM_SHUTTING_DOWN , jvmtiHookVMShutdownLast , OMR_GET_CALLSITE (), jvmtiData , J9HOOK_AGENTID_LAST )) {
1918
2061
return 1 ;
1919
2062
}
@@ -1952,7 +2095,6 @@ unhookGlobalEvents(J9JVMTIData * jvmtiData)
1952
2095
(* vmHook )-> J9HookUnregister (vmHook , J9HOOK_VM_SHUTTING_DOWN , jvmtiHookVMShutdownLast , NULL );
1953
2096
}
1954
2097
1955
-
1956
2098
static void
1957
2099
jvmtiHookMonitorContendedEnter (J9HookInterface * * hook , UDATA eventNum , void * eventData , void * userData )
1958
2100
{
0 commit comments