From: Mark Probst Date: Sat, 22 Sep 2012 10:40:35 +0000 (+0200) Subject: [dtrace] Probe for object moved, within or between heaps. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=ce2b1056004128129c8f4cd44e859e4c6a6b50b5;p=mono.git [dtrace] Probe for object moved, within or between heaps. --- 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)];