[sgen] More dtrace probes.
authorMark Probst <mark.probst@gmail.com>
Tue, 11 Dec 2012 13:58:08 +0000 (14:58 +0100)
committerMark Probst <mark.probst@gmail.com>
Thu, 3 Jan 2013 11:13:58 +0000 (12:13 +0100)
data/mono.d
mono/metadata/sgen-gc.c
mono/utils/dtrace.h

index dcd9303f0e5419d1d4e2675339c975ed95d1831e..db3d56c3e4c35dc8df0693797b244e7c43e89f8d 100644 (file)
@@ -19,6 +19,16 @@ provider mono {
        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);
@@ -59,6 +69,8 @@ provider mono {
        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
index c887e93cd6098342471cb97ca75ee7aae859aa7a..1b588c65bc3a4da00641c9ebf41b6e188e7fed72 100644 (file)
@@ -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
index fd7eeca90ad7ba404e8ec8333d5b24b166de68ab..755203a2f6b03165b848b1729d9b25c4395248d1 100644 (file)
 #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