Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Probst <mark.probst@gmail.com>2012-09-21 21:54:21 +0400
committerMark Probst <mark.probst@gmail.com>2012-09-29 01:18:17 +0400
commitb6463f1e142a3f5486a253ea34e05876778d93ee (patch)
tree087c3aa01e86a3e4e4b9728c15dc506f7f30e0b9
parent2aa252d522c57c90389a43983543937c51021621 (diff)
[dtrace] Probes for degraded and mature allocation.
-rw-r--r--data/mono.d3
-rw-r--r--mono/metadata/sgen-alloc.c38
2 files changed, 23 insertions, 18 deletions
diff --git a/data/mono.d b/data/mono.d
index e18d4eb12e9..efd3a6cb055 100644
--- a/data/mono.d
+++ b/data/mono.d
@@ -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
diff --git a/mono/metadata/sgen-alloc.c b/mono/metadata/sgen-alloc.c
index eec749e7c8b..4871f23e3b8 100644
--- a/mono/metadata/sgen-alloc.c
+++ b/mono/metadata/sgen-alloc.c
@@ -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);