[dtrace] Probes for large and pinned allocation.
authorMark Probst <mark.probst@gmail.com>
Sat, 22 Sep 2012 13:48:58 +0000 (15: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-alloc.c

index be871db851cc3fd18c8e8b97a0b5e59b02c49462..3542f6367f3e19f442bc0e84930d60f614398707 100644 (file)
@@ -28,6 +28,8 @@ 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__large (void *addr, uintptr_t size, char *class_name);
+       probe gc__major__obj__alloc__pinned (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);
 
index 4871f23e3b892c53afde6ceb56bb90cb255560f7..9ba03100c3ba084ee3fc854035537b5976f0d791 100644 (file)
@@ -220,6 +220,7 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size)
 
                        DEBUG (6, fprintf (gc_debug_file, "Allocated object %p, vtable: %p (%s), size: %zd\n", p, vtable, vtable->klass->name, size));
                        binary_protocol_alloc (p , vtable, size);
+                       MONO_GC_NURSERY_OBJ_ALLOC (p, size, NULL);
                        g_assert (*p == NULL);
                        mono_atomic_store_seq (p, vtable);
 
@@ -270,8 +271,6 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size)
                                        // no space left
                                        g_assert (0);
                                }
-                               if (p)
-                                       MONO_GC_NURSERY_OBJ_ALLOC (p, size, NULL);
 
                                if (nursery_clear_policy == CLEAR_AT_TLAB_CREATION) {
                                        memset (p, 0, size);
@@ -308,8 +307,6 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size)
                                        memset (TLAB_START, 0, alloc_size);
                                }
 
-                               MONO_GC_NURSERY_TLAB_ALLOC (p, alloc_size);
-
                                /* Allocate from the TLAB */
                                p = (void*)TLAB_NEXT;
                                TLAB_NEXT += size;
@@ -329,6 +326,12 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size)
        if (G_LIKELY (p)) {
                DEBUG (6, fprintf (gc_debug_file, "Allocated object %p, vtable: %p (%s), size: %zd\n", p, vtable, vtable->klass->name, size));
                binary_protocol_alloc (p, vtable, size);
+               if (MONO_GC_MAJOR_OBJ_ALLOC_LARGE_ENABLED () || MONO_GC_NURSERY_OBJ_ALLOC_ENABLED ()) {
+                       if (size > SGEN_MAX_SMALL_OBJ_SIZE)
+                               MONO_GC_MAJOR_OBJ_ALLOC_LARGE (p, size, NULL);
+                       else
+                               MONO_GC_NURSERY_OBJ_ALLOC (p, size, NULL);
+               }
                mono_atomic_store_seq (p, vtable);
        }
 
@@ -570,6 +573,10 @@ mono_gc_alloc_pinned_obj (MonoVTable *vtable, size_t size)
        }
        if (G_LIKELY (p)) {
                DEBUG (6, fprintf (gc_debug_file, "Allocated pinned object %p, vtable: %p (%s), size: %zd\n", p, vtable, vtable->klass->name, size));
+               if (size > SGEN_MAX_SMALL_OBJ_SIZE)
+                       MONO_GC_MAJOR_OBJ_ALLOC_LARGE (p, size, NULL);
+               else
+                       MONO_GC_MAJOR_OBJ_ALLOC_PINNED (p, size, NULL);
                binary_protocol_alloc_pinned (p, vtable, size);
                mono_atomic_store_seq (p, vtable);
        }