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:
authorMark Probst <mark.probst@gmail.com>2012-09-22 14:40:35 +0400
committerMark Probst <mark.probst@gmail.com>2012-09-29 01:18:19 +0400
commitce2b1056004128129c8f4cd44e859e4c6a6b50b5 (patch)
tree94308ea72d2686e6ac6696833e7b136b1676464d
parent936d70b46274f033c3dec6234d130843677ab8f9 (diff)
[dtrace] Probe for object moved, within or between heaps.
-rw-r--r--data/mono.d3
-rw-r--r--mono/metadata/sgen-copy-object.h6
2 files changed, 9 insertions, 0 deletions
diff --git a/data/mono.d b/data/mono.d
index fdc40124192..6d5ba78d079 100644
--- a/data/mono.d
+++ b/data/mono.d
@@ -33,6 +33,9 @@ provider mono {
probe gc__major__obj__alloc__degraded (void *addr, uintptr_t size, char *ns_name, char *class_name);
probe gc__major__obj__alloc__mature (void *addr, uintptr_t size, char *ns_name, char *class_name);
+ /* Can be nursery->nursery, nursery->major or major->major */
+ probe gc__obj__moved (void *dest, void *src, int dest_gen, int src_gen, uintptr_t size, char *ns_name, char *class_name);
+
probe gc__nursery__sweeped (void *addr, uintptr_t len);
probe gc__major__sweeped (void *addr, uintptr_t len);
diff --git a/mono/metadata/sgen-copy-object.h b/mono/metadata/sgen-copy-object.h
index 7526a3f8363..1b183952cd4 100644
--- a/mono/metadata/sgen-copy-object.h
+++ b/mono/metadata/sgen-copy-object.h
@@ -43,6 +43,12 @@ par_copy_object_no_checks (char *destination, MonoVTable *vt, void *obj, mword o
DEBUG (9, fprintf (gc_debug_file, " (to %p, %s size: %lu)\n", destination, ((MonoObject*)obj)->vtable->klass->name, (unsigned long)objsize));
binary_protocol_copy (obj, destination, vt, objsize);
+ if (G_UNLIKELY (MONO_GC_OBJ_MOVED_ENABLED ())) {
+ int dest_gen = sgen_ptr_in_nursery (destination) ? GENERATION_NURSERY : GENERATION_OLD;
+ int src_gen = sgen_ptr_in_nursery (obj) ? GENERATION_NURSERY : GENERATION_OLD;
+ MONO_GC_OBJ_MOVED (destination, obj, dest_gen, src_gen, objsize, vt->klass->name_space, vt->klass->name);
+ }
+
if (objsize <= sizeof (gpointer) * 8) {
mword *dest = (mword*)destination;
goto *copy_labels [objsize / sizeof (gpointer)];