[dtrace] Probe for object moved, within or between heaps.
authorMark Probst <mark.probst@gmail.com>
Sat, 22 Sep 2012 10:40:35 +0000 (12:40 +0200)
committerMark Probst <mark.probst@gmail.com>
Fri, 28 Sep 2012 21:18:19 +0000 (23:18 +0200)
data/mono.d
mono/metadata/sgen-copy-object.h

index fdc40124192ed9392815ee378a6fb0cfb80e1618..6d5ba78d07970af42f27ce6e68b5b42e8200a89f 100644 (file)
@@ -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);
 
index 7526a3f836309b9d0e1389d6418141892bf1052b..1b183952cd4614bf8a5d8e67c3e53d398508fd27 100644 (file)
@@ -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)];