diff options
-rw-r--r-- | data/mono.d | 5 | ||||
-rw-r--r-- | mono/metadata/gc.c | 6 | ||||
-rw-r--r-- | mono/metadata/sgen-fin-weak-hash.c | 12 | ||||
-rw-r--r-- | mono/metadata/sgen-gc.c | 10 | ||||
-rw-r--r-- | mono/utils/dtrace.h | 11 |
5 files changed, 43 insertions, 1 deletions
diff --git a/data/mono.d b/data/mono.d index bb42812b0d9..dcd9303f0e5 100644 --- a/data/mono.d +++ b/data/mono.d @@ -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 diff --git a/mono/metadata/gc.c b/mono/metadata/gc.c index c6e01da6f6e..0c2f7549552 100644 --- a/mono/metadata/gc.c +++ b/mono/metadata/gc.c @@ -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) diff --git a/mono/metadata/sgen-fin-weak-hash.c b/mono/metadata/sgen-fin-weak-hash.c index 20cff63039a..3c52043cd26 100644 --- a/mono/metadata/sgen-fin-weak-hash.c +++ b/mono/metadata/sgen-fin-weak-hash.c @@ -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 diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index eaa48fe99cb..5f6bda5c912 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -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 diff --git a/mono/utils/dtrace.h b/mono/utils/dtrace.h index 0e2492c73d3..6db0c5dc520 100644 --- a/mono/utils/dtrace.h +++ b/mono/utils/dtrace.h @@ -96,6 +96,17 @@ #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 |