@@ -76,6 +76,8 @@ struct JavaInteropGCBridge {
7676 char *gref_path, *lref_path;
7777 int gref_log_level, lref_log_level;
7878 int gref_cleanup, lref_cleanup;
79+
80+ JavaInteropMarkCrossReferencesCallback mark_cross_references;
7981};
8082
8183static jobject
@@ -1283,6 +1285,46 @@ gc_cross_references (int num_sccs, MonoGCBridgeSCC **sccs, int num_xrefs, MonoGC
12831285 free (thread_name);
12841286}
12851287
1288+ static void
1289+ managed_gc_cross_references (int num_sccs, MonoGCBridgeSCC **sccs, int num_xrefs, MonoGCBridgeXRef *xrefs)
1290+ {
1291+ if (mono_bridge->mark_cross_references == NULL ) {
1292+ assert (!" mono_bridge->mark_cross_references is NULL; WE SHOULD NOT BE EXECUTING" );
1293+ return ;
1294+ }
1295+ int i;
1296+
1297+ Srij_MarkCrossReferences cross_references = {};
1298+
1299+ cross_references.ComponentsLen = (void *) (intptr_t ) num_sccs;
1300+ cross_references.Components = (Srij_StronglyConnectedComponent*) calloc (num_sccs, sizeof (Srij_StronglyConnectedComponent));
1301+ for (i = 0 ; i < num_sccs; ++i) {
1302+ Srij_StronglyConnectedComponent *scc = &cross_references.Components [i];
1303+
1304+ scc->Count = (void *) (intptr_t ) sccs [i]->num_objs ;
1305+ scc->Context = (void **) calloc (sccs [i]->num_objs , sizeof (void *));
1306+ for (int j = 0 ; j < sccs [i]->num_objs ; ++j) {
1307+ MonoObject *obj = sccs [i]->objs [j];
1308+ scc->Context [j] = get_gc_control_block_for_object (mono_bridge, obj);
1309+ }
1310+ }
1311+
1312+ cross_references.CrossReferencesLen = (void *) (intptr_t ) num_xrefs;
1313+ cross_references.CrossReferences = (Srij_ComponentCrossReference*) calloc (num_xrefs, sizeof (Srij_ComponentCrossReference));
1314+ for (i = 0 ; i < num_xrefs; ++i) {
1315+ Srij_ComponentCrossReference *xref = &cross_references.CrossReferences [i];
1316+ xref->SourceGroupIndex = (void *) (intptr_t ) xrefs [i].src_scc_index ;
1317+ xref->DestinationGroupIndex = (void *) (intptr_t ) xrefs [i].dst_scc_index ;
1318+ }
1319+
1320+ mono_bridge->mark_cross_references (&cross_references);
1321+
1322+ for (i = 0 ; i < num_sccs; ++i) {
1323+ Srij_StronglyConnectedComponent *scc = &cross_references.Components [i];
1324+ sccs [i]->is_alive = scc->IsAlive ;
1325+ }
1326+ }
1327+
12861328int
12871329java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, int weak_ref_kind)
12881330{
@@ -1316,7 +1358,9 @@ java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, int weak_ref
13161358 bridge_cbs.bridge_version = SGEN_BRIDGE_VERSION;
13171359 bridge_cbs.bridge_class_kind = gc_bridge_class_kind;
13181360 bridge_cbs.is_bridge_object = gc_is_bridge_object;
1319- bridge_cbs.cross_references = gc_cross_references;
1361+ bridge_cbs.cross_references = bridge->mark_cross_references
1362+ ? managed_gc_cross_references
1363+ : gc_cross_references;
13201364
13211365 mono_gc_register_bridge_callbacks (&bridge_cbs);
13221366
@@ -1332,3 +1376,28 @@ java_interop_gc_bridge_wait_for_bridge_processing (JavaInteropGCBridge *bridge)
13321376 mono_gc_wait_for_bridge_processing ();
13331377 return 0 ;
13341378}
1379+
1380+ int
1381+ java_interop_gc_bridge_set_mark_cross_references (JavaInteropGCBridge *bridge, JavaInteropMarkCrossReferencesCallback markCrossReferences)
1382+ {
1383+ if (bridge == NULL )
1384+ return -1 ;
1385+
1386+ bridge->mark_cross_references = markCrossReferences;
1387+
1388+ return 0 ;
1389+ }
1390+
1391+ int
1392+ java_interop_gc_bridge_release_mark_cross_references_resources (JavaInteropGCBridge *bridge, Srij_MarkCrossReferences *crossReferences)
1393+ {
1394+ if (bridge == NULL )
1395+ return -1 ;
1396+
1397+ if (crossReferences == NULL )
1398+ return -1 ;
1399+
1400+ // leak it…
1401+
1402+ return 0 ;
1403+ }
0 commit comments