[sgen] DTrace probes for finalisers and weak links.
authorMark Probst <mark.probst@gmail.com>
Tue, 27 Nov 2012 17:01:02 +0000 (18:01 +0100)
committerMark Probst <mark.probst@gmail.com>
Sun, 9 Dec 2012 14:02:51 +0000 (15:02 +0100)
data/mono.d
mono/metadata/gc.c
mono/metadata/sgen-fin-weak-hash.c
mono/metadata/sgen-gc.c
mono/utils/dtrace.h

index bb42812b0d9c3c87df1a6f8fc5794763ba6c17ab..dcd9303f0e5419d1d4e2675339c975ed95d1831e 100644 (file)
@@ -54,6 +54,11 @@ provider mono {
        probe gc__major__swept (uintptr_t addr, uintptr_t len);
 
        probe gc__obj__pinned (uintptr_t addr, uintptr_t size, char *ns_name, char *class_name, int generation);
+
+       probe gc__finalize__enqueue (uintptr_t addr, uintptr_t size, char *ns_name, char *class_name, int generation, int is_critical);
+       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);
 };
 
 #pragma D attributes Evolving/Evolving/Common provider mono provider
index c6e01da6f6ef32d68c6ae1474bb227da0ac1b85c..0c2f7549552f680bd14169c507db704905bba65c 100644 (file)
@@ -34,6 +34,7 @@
 #include <mono/utils/mono-semaphore.h>
 #include <mono/utils/mono-memory-model.h>
 #include <mono/utils/mono-counters.h>
+#include <mono/utils/dtrace.h>
 
 #ifndef HOST_WIN32
 #include <pthread.h>
@@ -227,6 +228,11 @@ mono_gc_run_finalize (void *obj, void *data)
 
        mono_runtime_class_init (o->vtable);
 
+       if (G_UNLIKELY (MONO_GC_FINALIZE_INVOKE_ENABLED ())) {
+               MONO_GC_FINALIZE_INVOKE ((unsigned long)o, mono_object_get_size (o),
+                               o->vtable->klass->name_space, o->vtable->klass->name);
+       }
+
        runtime_invoke (o, NULL, &exc, NULL);
 
        if (exc)
index 20cff63039a77c4293e249e340f461435492a2ec..3c52043cd266d7c7d5e635d6c94da7554fbd7ea2 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "metadata/sgen-gc.h"
 #include "metadata/sgen-gray.h"
+#include "utils/dtrace.h"
 
 #define ptr_in_nursery sgen_ptr_in_nursery
 
@@ -583,6 +584,17 @@ sgen_process_dislink_stage_entries (void)
 void
 sgen_register_disappearing_link (MonoObject *obj, void **link, gboolean track, gboolean in_gc)
 {
+       if (MONO_GC_WEAK_UPDATE_ENABLED ()) {
+               MonoVTable *vt = obj ? (MonoVTable*)SGEN_LOAD_VTABLE (obj) : NULL;
+               MONO_GC_WEAK_UPDATE ((mword)link,
+                               *link ? (mword)DISLINK_OBJECT (link) : (mword)0,
+                               (mword)obj,
+                               obj ? (mword)sgen_safe_object_get_size (obj) : (mword)0,
+                               obj ? vt->klass->name_space : NULL,
+                               obj ? vt->klass->name : NULL,
+                               track ? 1 : 0);
+       }
+
        if (obj)
                *link = HIDE_POINTER (obj, track);
        else
index eaa48fe99cba0b52759dc14bc3d9b9aa1283c8fd..5f6bda5c91246441bdb63f31411fefbb35163b10 100644 (file)
@@ -3377,14 +3377,22 @@ void
 sgen_queue_finalization_entry (MonoObject *obj)
 {
        FinalizeReadyEntry *entry = sgen_alloc_internal (INTERNAL_MEM_FINALIZE_READY_ENTRY);
+       gboolean critical = has_critical_finalizer (obj);
        entry->object = obj;
-       if (has_critical_finalizer (obj)) {
+       if (critical) {
                entry->next = critical_fin_list;
                critical_fin_list = entry;
        } else {
                entry->next = fin_ready_list;
                fin_ready_list = entry;
        }
+
+       if (G_UNLIKELY (MONO_GC_FINALIZE_ENQUEUE_ENABLED ())) {
+               int gen = sgen_ptr_in_nursery (obj) ? GENERATION_NURSERY : GENERATION_OLD;
+               MonoVTable *vt = (MonoVTable*)LOAD_VTABLE (obj);
+               MONO_GC_FINALIZE_ENQUEUE ((mword)obj, sgen_safe_object_get_size (obj),
+                               vt->klass->name_space, vt->klass->name, gen, critical);
+       }
 }
 
 static inline int
index 0e2492c73d3cdffbf77d84fbbc0971e71eccd9e2..6db0c5dc520ac3a56d9d252d199838b436f5e18f 100644 (file)
 #define MONO_GC_OBJ_PINNED(addr,size,ns_name,class_name,generation)
 #define MONO_GC_OBJ_PINNED_ENABLED()   (0)
 
+
+#define MONO_GC_FINALIZE_ENQUEUE(addr,size,ns_name,class_name,generation,is_critical)
+#define MONO_GC_FINALIZE_ENQUEUE_ENABLED()     (0)
+
+#define MONO_GC_FINALIZE_INVOKE(addr,size,ns_name,class_name)
+#define MONO_GC_FINALIZE_INVOKE_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)
+
 #endif
 
 #endif