static int max_sccs_links = 0;
void
-mono_sgen_bridge_processing_register_objects (int num_objs, MonoObject **objs)
+mono_sgen_bridge_register_finalized_object (MonoObject *obj)
{
- int i;
- SGEN_TV_DECLARE (atv);
- SGEN_TV_DECLARE (btv);
-
- fist_pass_links = second_pass_links = sccs_links = 0;
- dsf1_passes = dsf2_passes = 0;
- SGEN_TV_GETTIME (atv);
-
g_assert (mono_sgen_need_bridge_processing ());
- //g_print ("%d finalized objects\n", num_objs);
-
- /* The collector step checks for bridge objects already, so we don't need to do it again. */
- for (i = 0; i < num_objs; ++i) {
- MonoObject *obj = objs [i];
- if (register_bridge_object (obj))
- dyn_array_ptr_push (®istered_bridges, obj);
- }
-
- SGEN_TV_GETTIME (btv);
- step_1 += SGEN_TV_ELAPSED (atv, btv);
+ if (register_bridge_object (obj))
+ dyn_array_ptr_push (®istered_bridges, obj);
}
void
}
}
-static MonoObject **finalized_array = NULL;
-static int finalized_array_capacity = 0;
-static int finalized_array_entries = 0;
-
-static void
-bridge_register_finalized_object (MonoObject *object)
-{
- if (!finalized_array)
- return;
-
- if (finalized_array_entries >= finalized_array_capacity) {
- MonoObject **new_array;
- g_assert (finalized_array_entries == finalized_array_capacity);
- finalized_array_capacity *= 2;
- new_array = mono_sgen_alloc_internal_dynamic (sizeof (MonoObject*) * finalized_array_capacity, INTERNAL_MEM_BRIDGE_DATA);
- memcpy (new_array, finalized_array, sizeof (MonoObject*) * finalized_array_entries);
- mono_sgen_free_internal_dynamic (finalized_array, sizeof (MonoObject*) * finalized_array_entries, INTERNAL_MEM_BRIDGE_DATA);
- finalized_array = new_array;
- }
- finalized_array [finalized_array_entries++] = object;
-}
static void
stw_bridge_process (void)
mono_sgen_scan_togglerefs (copy_func, nursery_start, nursery_end, queue);
if (mono_sgen_need_bridge_processing ()) {
- if (finalized_array == NULL) {
- finalized_array_capacity = 32;
- finalized_array = mono_sgen_alloc_internal_dynamic (sizeof (MonoObject*) * finalized_array_capacity, INTERNAL_MEM_BRIDGE_DATA);
- }
- finalized_array_entries = 0;
-
collect_bridge_objects (copy_func, start_addr, end_addr, generation, queue);
if (generation == GENERATION_OLD)
collect_bridge_objects (copy_func, nursery_start, nursery_end, GENERATION_NURSERY, queue);
-
- if (finalized_array_entries > 0) {
- mono_sgen_bridge_processing_register_objects (finalized_array_entries, finalized_array);
- finalized_array_entries = 0;
- }
mono_sgen_drain_gray_stack (queue, -1);
}
gboolean mono_sgen_object_is_live (void *obj) MONO_INTERNAL;
gboolean mono_sgen_need_bridge_processing (void) MONO_INTERNAL;
-void mono_sgen_bridge_processing_register_objects (int num_objs, MonoObject **objs) MONO_INTERNAL;
void mono_sgen_bridge_processing_stw_step (void) MONO_INTERNAL;
void mono_sgen_bridge_processing_finish (void) MONO_INTERNAL;
void mono_sgen_register_test_bridge_callbacks (const char *bridge_class_name) MONO_INTERNAL;
gboolean mono_sgen_is_bridge_object (MonoObject *obj) MONO_INTERNAL;
void mono_sgen_mark_bridge_object (MonoObject *obj) MONO_INTERNAL;
+void mono_sgen_bridge_register_finalized_object (MonoObject *object) MONO_INTERNAL;
void mono_sgen_scan_togglerefs (CopyOrMarkObjectFunc copy_func, char *start, char *end, SgenGrayQueue *queue) MONO_INTERNAL;
void mono_sgen_process_togglerefs (void) MONO_INTERNAL;