X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsgen-gc.c;h=1b588c65bc3a4da00641c9ebf41b6e188e7fed72;hb=85b8bd1f70b647185ba979a5613efeb59980194f;hp=c887e93cd6098342471cb97ca75ee7aae859aa7a;hpb=5e7bb4679b605ec617fedf3efa5e06d92f73b4d9;p=mono.git diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index c887e93cd60..1b588c65bc3 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -1141,6 +1141,13 @@ void 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); + } } /* @@ -2518,9 +2525,13 @@ collect_nursery (SgenGrayQueue *unpin_queue) 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); @@ -2539,6 +2550,8 @@ collect_nursery (SgenGrayQueue *unpin_queue) 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 (); @@ -2567,6 +2580,8 @@ collect_nursery (SgenGrayQueue *unpin_queue) 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; @@ -2581,6 +2596,8 @@ collect_nursery (SgenGrayQueue *unpin_queue) 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; @@ -2601,6 +2618,8 @@ collect_nursery (SgenGrayQueue *unpin_queue) 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 (); @@ -2611,6 +2630,8 @@ collect_nursery (SgenGrayQueue *unpin_queue) 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 ()) @@ -2625,11 +2646,15 @@ collect_nursery (SgenGrayQueue *unpin_queue) 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