probe gc__begin (int generation);
probe gc__end (int generation);
+ probe gc__checkpoint__1 (int generation);
+ probe gc__checkpoint__2 (int generation);
+ probe gc__checkpoint__3 (int generation);
+ probe gc__checkpoint__4 (int generation);
+ probe gc__checkpoint__5 (int generation);
+ probe gc__checkpoint__6 (int generation);
+ probe gc__checkpoint__7 (int generation);
+ probe gc__checkpoint__8 (int generation);
+ probe gc__checkpoint__9 (int generation);
+
probe gc__concurrent__start__begin (int generation);
probe gc__concurrent__start__end (int generation, long long num_major_objects_marked);
probe gc__concurrent__update__finish__begin (int generation, long long num_major_objects_marked);
probe gc__finalize__invoke (uintptr_t addr, uintptr_t size, char *ns_name, char *class_name);
probe gc__weak__update (uintptr_t ref_addr, uintptr_t old_addr, uintptr_t new_addr, uintptr_t size, char *ns_name, char *class_name, int track);
+
+ probe gc__global__remset__add (uintptr_t ref_addr, uintptr_t obj_addr, uintptr_t size, char *ns_name, char *class_name);
};
#pragma D attributes Evolving/Evolving/Common provider mono provider
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
#define MONO_GC_END_ENABLED() (0)
+#define MONO_GC_CHECKPOINT_1(generation)
+#define MONO_GC_CHECKPOINT_1_ENABLED() (0)
+
+#define MONO_GC_CHECKPOINT_2(generation)
+#define MONO_GC_CHECKPOINT_2_ENABLED() (0)
+
+#define MONO_GC_CHECKPOINT_3(generation)
+#define MONO_GC_CHECKPOINT_3_ENABLED() (0)
+
+#define MONO_GC_CHECKPOINT_4(generation)
+#define MONO_GC_CHECKPOINT_4_ENABLED() (0)
+
+#define MONO_GC_CHECKPOINT_5(generation)
+#define MONO_GC_CHECKPOINT_5_ENABLED() (0)
+
+#define MONO_GC_CHECKPOINT_6(generation)
+#define MONO_GC_CHECKPOINT_6_ENABLED() (0)
+
+#define MONO_GC_CHECKPOINT_7(generation)
+#define MONO_GC_CHECKPOINT_7_ENABLED() (0)
+
+#define MONO_GC_CHECKPOINT_8(generation)
+#define MONO_GC_CHECKPOINT_8_ENABLED() (0)
+
+#define MONO_GC_CHECKPOINT_9(generation)
+#define MONO_GC_CHECKPOINT_9_ENABLED() (0)
+
+
#define MONO_GC_CONCURRENT_START_BEGIN(generation)
#define MONO_GC_CONCURRENT_START_BEGIN_ENABLED() (0)
#define MONO_GC_WEAK_UPDATE(ref_addr,old_addr,new_addr,size,ns_name,class_name,track)
#define MONO_GC_WEAK_UPDATE_ENABLED() (0)
+
+#define MONO_GC_GLOBAL_REMSET_ADD(ref_addr,obj_addr,size,ns_name,class_name)
+#define MONO_GC_GLOBAL_REMSET_ADD() (0)
+
#endif
#endif