sgen_add_to_global_remset (gpointer ptr)
{
remset.record_pointer (ptr);
+
+ if (G_UNLIKELY (MONO_GC_GLOBAL_REMSET_ADD_ENABLED ())) {
+ void *obj = *(void**)ptr;
+ MonoVTable *vt = (MonoVTable*)LOAD_VTABLE (obj);
+ MONO_GC_GLOBAL_REMSET_ADD ((mword)ptr, (mword)obj, sgen_safe_object_get_size (obj),
+ vt->klass->name_space, vt->klass->name);
+ }
}
/*
if (remset.prepare_for_minor_collection)
remset.prepare_for_minor_collection ();
+ MONO_GC_CHECKPOINT_1 (GENERATION_NURSERY);
+
sgen_process_fin_stage_entries ();
sgen_process_dislink_stage_entries ();
+ MONO_GC_CHECKPOINT_2 (GENERATION_NURSERY);
+
/* pin from pinned handles */
sgen_init_pinning ();
mono_profiler_gc_event (MONO_GC_EVENT_MARK_START, 0);
SGEN_LOG (2, "Finding pinned pointers: %d in %d usecs", sgen_get_pinned_count (), TV_ELAPSED (btv, atv));
SGEN_LOG (4, "Start scan with %d pinned objects", sgen_get_pinned_count ());
+ MONO_GC_CHECKPOINT_3 (GENERATION_NURSERY);
+
if (whole_heap_check_before_collection) {
sgen_clear_nursery_fragments ();
sgen_check_whole_heap ();
time_minor_scan_remsets += TV_ELAPSED (atv, btv);
SGEN_LOG (2, "Old generation scan: %d usecs", TV_ELAPSED (atv, btv));
+ MONO_GC_CHECKPOINT_4 (GENERATION_NURSERY);
+
if (!sgen_collection_is_parallel ()) {
ctx.scan_func = current_object_ops.scan_object;
ctx.copy_func = NULL;
TV_GETTIME (atv);
time_minor_scan_pinned += TV_ELAPSED (btv, atv);
+ MONO_GC_CHECKPOINT_5 (GENERATION_NURSERY);
+
/* registered roots, this includes static fields */
scrrjd_normal = sgen_alloc_internal_dynamic (sizeof (ScanFromRegisteredRootsJobData), INTERNAL_MEM_WORKER_JOB_DATA, TRUE);
scrrjd_normal->copy_or_mark_func = current_object_ops.copy_or_mark_object;
TV_GETTIME (btv);
time_minor_scan_registered_roots += TV_ELAPSED (atv, btv);
+ MONO_GC_CHECKPOINT_6 (GENERATION_NURSERY);
+
/* thread data */
stdjd = sgen_alloc_internal_dynamic (sizeof (ScanThreadDataJobData), INTERNAL_MEM_WORKER_JOB_DATA, TRUE);
stdjd->heap_start = sgen_get_nursery_start ();
time_minor_scan_thread_data += TV_ELAPSED (btv, atv);
btv = atv;
+ MONO_GC_CHECKPOINT_7 (GENERATION_NURSERY);
+
g_assert (!sgen_collection_is_parallel () && !sgen_collection_is_concurrent ());
if (sgen_collection_is_parallel () || sgen_collection_is_concurrent ())
sfejd_critical_fin->list = critical_fin_list;
sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
+ MONO_GC_CHECKPOINT_8 (GENERATION_NURSERY);
+
finish_gray_stack (sgen_get_nursery_start (), nursery_next, GENERATION_NURSERY, &gray_queue);
TV_GETTIME (atv);
time_minor_finish_gray_stack += TV_ELAPSED (btv, atv);
mono_profiler_gc_event (MONO_GC_EVENT_MARK_END, 0);
+ MONO_GC_CHECKPOINT_9 (GENERATION_NURSERY);
+
/*
* The (single-threaded) finalization code might have done
* some copying/marking so we can only reset the GC thread's