Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/mono.d5
-rw-r--r--mono/metadata/gc.c6
-rw-r--r--mono/metadata/sgen-fin-weak-hash.c12
-rw-r--r--mono/metadata/sgen-gc.c10
-rw-r--r--mono/utils/dtrace.h11
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