@@ -76,6 +76,8 @@ struct JavaInteropGCBridge {
76
76
char *gref_path, *lref_path;
77
77
int gref_log_level, lref_log_level;
78
78
int gref_cleanup, lref_cleanup;
79
+
80
+ JavaInteropMarkCrossReferencesCallback mark_cross_references;
79
81
};
80
82
81
83
static jobject
@@ -1283,6 +1285,46 @@ gc_cross_references (int num_sccs, MonoGCBridgeSCC **sccs, int num_xrefs, MonoGC
1283
1285
free (thread_name);
1284
1286
}
1285
1287
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
+
1286
1328
int
1287
1329
java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, int weak_ref_kind)
1288
1330
{
@@ -1316,7 +1358,9 @@ java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, int weak_ref
1316
1358
bridge_cbs.bridge_version = SGEN_BRIDGE_VERSION;
1317
1359
bridge_cbs.bridge_class_kind = gc_bridge_class_kind;
1318
1360
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;
1320
1364
1321
1365
mono_gc_register_bridge_callbacks (&bridge_cbs);
1322
1366
@@ -1332,3 +1376,28 @@ java_interop_gc_bridge_wait_for_bridge_processing (JavaInteropGCBridge *bridge)
1332
1376
mono_gc_wait_for_bridge_processing ();
1333
1377
return 0 ;
1334
1378
}
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