[dtrace] Probes for degraded and mature allocation.
authorMark Probst <mark.probst@gmail.com>
Fri, 21 Sep 2012 17:54:21 +0000 (19:54 +0200)
committerMark Probst <mark.probst@gmail.com>
Fri, 28 Sep 2012 21:18:17 +0000 (23:18 +0200)
data/mono.d
mono/metadata/sgen-alloc.c

index e18d4eb12e9ab6364020d8cf4e09974f1ac0810a..efd3a6cb0552a00102957dd8c9bc6a04af3e2ecb 100644 (file)
@@ -27,6 +27,9 @@ provider mono {
 
        probe gc__nursery__tlab__alloc (void *addr, uintptr_t len);
        probe gc__nursery__obj__alloc (void *addr, uintptr_t size, char *class_name);
+
+       probe gc__major__obj__alloc__degraded (void *addr, uintptr_t size, char *class_name);
+       probe gc__major__obj__alloc__mature (void *addr, uintptr_t size, char *class_name);
 };
 
 #pragma D attributes Evolving/Evolving/Common provider mono provider
index eec749e7c8bc7770419b9989edb87107929464d8..4871f23e3b892c53afde6ceb56bb90cb255560f7 100644 (file)
@@ -117,6 +117,8 @@ alloc_degraded (MonoVTable *vtable, size_t size, gboolean for_mature)
        static int last_major_gc_warned = -1;
        static int num_degraded = 0;
 
+       void *p;
+
        if (!for_mature) {
                if (last_major_gc_warned < stat_major_gcs) {
                        ++num_degraded;
@@ -131,7 +133,16 @@ alloc_degraded (MonoVTable *vtable, size_t size, gboolean for_mature)
 
        sgen_ensure_free_space (size);
 
-       return major_collector.alloc_degraded (vtable, size);
+       p = major_collector.alloc_degraded (vtable, size);
+
+       if (for_mature) {
+               MONO_GC_MAJOR_OBJ_ALLOC_MATURE (p, size, NULL);
+       } else {
+               binary_protocol_alloc_degraded (p, vtable, size);
+               MONO_GC_MAJOR_OBJ_ALLOC_DEGRADED (p, size, NULL);
+       }
+
+       return p;
 }
 
 /*
@@ -239,11 +250,8 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size)
                        /* when running in degraded mode, we continue allocing that way
                         * for a while, to decrease the number of useless nursery collections.
                         */
-                       if (degraded_mode && degraded_mode < DEFAULT_NURSERY_SIZE) {
-                               p = alloc_degraded (vtable, size, FALSE);
-                               binary_protocol_alloc_degraded (p, vtable, size);
-                               return p;
-                       }
+                       if (degraded_mode && degraded_mode < DEFAULT_NURSERY_SIZE)
+                               return alloc_degraded (vtable, size, FALSE);
 
                        available_in_tlab = TLAB_REAL_END - TLAB_NEXT;
                        if (size > tlab_size || available_in_tlab > SGEN_MAX_NURSERY_WASTE) {
@@ -252,13 +260,10 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size)
                                        p = sgen_nursery_alloc (size);
                                        if (!p) {
                                                sgen_ensure_free_space (size);
-                                               if (degraded_mode) {
-                                                       p = alloc_degraded (vtable, size, FALSE);
-                                                       binary_protocol_alloc_degraded (p, vtable, size);
-                                                       return p;
-                                               } else {
+                                               if (degraded_mode)
+                                                       return alloc_degraded (vtable, size, FALSE);
+                                               else
                                                        p = sgen_nursery_alloc (size);
-                                               }
                                        }
                                } while (!p);
                                if (!p) {
@@ -281,13 +286,10 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size)
                                        p = sgen_nursery_alloc_range (tlab_size, size, &alloc_size);
                                        if (!p) {
                                                sgen_ensure_free_space (tlab_size);
-                                               if (degraded_mode) {
-                                                       p = alloc_degraded (vtable, size, FALSE);
-                                                       binary_protocol_alloc_degraded (p, vtable, size);
-                                                       return p;
-                                               } else {
+                                               if (degraded_mode)
+                                                       return alloc_degraded (vtable, size, FALSE);
+                                               else
                                                        p = sgen_nursery_alloc_range (tlab_size, size, &alloc_size);
-                                               }               
                                        }
                                } while (!p);