[dtrace] Probe for pinning of objects.
authorMark Probst <mark.probst@gmail.com>
Sat, 22 Sep 2012 12:48:17 +0000 (14:48 +0200)
committerMark Probst <mark.probst@gmail.com>
Fri, 28 Sep 2012 21:18:18 +0000 (23:18 +0200)
data/mono.d
mono/metadata/sgen-gc.c
mono/metadata/sgen-marksweep.c

index 7b00d5df017fddb998378e6ce87d3ebd25984a19..be871db851cc3fd18c8e8b97a0b5e59b02c49462 100644 (file)
@@ -33,6 +33,8 @@ provider mono {
 
        probe gc__nursery__sweeped (void *addr, uintptr_t len);
        probe gc__major__sweeped (void *addr, uintptr_t len);
+
+       probe gc__obj__pinned (void *addr, uintptr_t size, char *class_name, int generation);
 };
 
 #pragma D attributes Evolving/Evolving/Common provider mono provider
index 6080724b69b821d83cb594de84f89780009f9bf7..de331419146be6151a56a815ef595b768961f4e1 100644 (file)
@@ -1245,6 +1245,10 @@ pin_objects_from_addresses (GCMemSection *section, void **start, void **end, voi
                                        if (addr >= search_start && (char*)addr < (char*)last_obj + last_obj_size) {
                                                DEBUG (4, fprintf (gc_debug_file, "Pinned object %p, vtable %p (%s), count %d\n", search_start, *(void**)search_start, safe_name (search_start), count));
                                                binary_protocol_pin (search_start, (gpointer)LOAD_VTABLE (search_start), safe_object_get_size (search_start));
+                                               if (MONO_GC_OBJ_PINNED_ENABLED ()) {
+                                                       int gen = sgen_ptr_in_nursery (search_start) ? GENERATION_NURSERY : GENERATION_OLD;
+                                                       MONO_GC_OBJ_PINNED (search_start, sgen_safe_object_get_size (search_start), NULL, gen);
+                                               }
                                                pin_object (search_start);
                                                GRAY_OBJECT_ENQUEUE (queue, search_start);
                                                if (G_UNLIKELY (do_pin_stats))
@@ -1310,6 +1314,10 @@ sgen_pin_object (void *object, GrayQueue *queue)
        }
        GRAY_OBJECT_ENQUEUE (queue, object);
        binary_protocol_pin (object, (gpointer)LOAD_VTABLE (object), safe_object_get_size (object));
+       if (MONO_GC_OBJ_PINNED_ENABLED ()) {
+               int gen = sgen_ptr_in_nursery (object) ? GENERATION_NURSERY : GENERATION_OLD;
+               MONO_GC_OBJ_PINNED (object, sgen_safe_object_get_size (object), NULL, gen);
+       }
 }
 
 void
@@ -2689,6 +2697,9 @@ major_do_collection (const char *reason)
                report.count = 0;
                if (sgen_find_optimized_pin_queue_area (bigobj->data, (char*)bigobj->data + bigobj->size, &dummy)) {
                        binary_protocol_pin (bigobj->data, (gpointer)LOAD_VTABLE (bigobj->data), safe_object_get_size (bigobj->data));
+                       if (MONO_GC_OBJ_PINNED_ENABLED ()) {
+                               MONO_GC_OBJ_PINNED (bigobj->data, sgen_safe_object_get_size ((MonoObject*)bigobj->data), NULL, GENERATION_OLD);
+                       }
                        pin_object (bigobj->data);
                        /* FIXME: only enqueue if object has references */
                        GRAY_OBJECT_ENQUEUE (WORKERS_DISTRIBUTE_GRAY_QUEUE, bigobj->data);
index 7d208d562f86c1f0a1a89085d31d9a3af0d7ce37..72cd5c5b4a3732615761733183e2e4c8c6620a8f 100644 (file)
@@ -1370,6 +1370,9 @@ major_copy_or_mark_object (void **ptr, SgenGrayQueue *queue)
                        if (SGEN_OBJECT_IS_PINNED (obj))
                                return;
                        binary_protocol_pin (obj, (gpointer)SGEN_LOAD_VTABLE (obj), sgen_safe_object_get_size ((MonoObject*)obj));
+                       if (MONO_GC_OBJ_PINNED_ENABLED ()) {
+                               MONO_GC_OBJ_PINNED (obj, sgen_safe_object_get_size (obj), NULL, GENERATION_OLD);
+                       }
                        SGEN_PIN_OBJECT (obj);
                        /* FIXME: only enqueue if object has references */
                        GRAY_OBJECT_ENQUEUE (queue, obj);