#ifdef HEAVY_STATISTICS
static long long stat_scanned_count_per_descriptor [DESC_TYPE_MAX];
+static long long stat_copied_count_per_descriptor [DESC_TYPE_MAX];
#endif
static int
SGEN_ASSERT (0, type, "Descriptor type can't be zero");
++stat_scanned_count_per_descriptor [type - 1];
}
+
+void
+sgen_descriptor_count_copied_object (mword desc)
+{
+ int type = desc & 7;
+ SGEN_ASSERT (0, type, "Descriptor type can't be zero");
+ ++stat_copied_count_per_descriptor [type - 1];
+}
#endif
void
mono_counters_register ("# scanned LARGE_BITMAP", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_LARGE_BITMAP - 1]);
mono_counters_register ("# scanned COMPLEX_ARR", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_COMPLEX_ARR - 1]);
mono_counters_register ("# scanned COMPLEX_PTRFREE", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_COMPLEX_PTRFREE - 1]);
+
+ mono_counters_register ("# copied RUN_LENGTH", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_RUN_LENGTH - 1]);
+ mono_counters_register ("# copied SMALL_BITMAP", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_SMALL_BITMAP - 1]);
+ mono_counters_register ("# copied COMPLEX", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_COMPLEX - 1]);
+ mono_counters_register ("# copied VECTOR", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_VECTOR - 1]);
+ mono_counters_register ("# copied LARGE_BITMAP", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_LARGE_BITMAP - 1]);
+ mono_counters_register ("# copied COMPLEX_ARR", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_COMPLEX_ARR - 1]);
+ mono_counters_register ("# copied COMPLEX_PTRFREE", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_COMPLEX_PTRFREE - 1]);
#endif
}
MSBlockInfo *block;
#endif
- HEAVY_STAT (++stat_optimized_copy);
+#ifdef HEAVY_STATISTICS
+ ++stat_optimized_copy;
+ {
+ char *forwarded;
+ mword desc;
+ if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj)))
+ desc = sgen_obj_get_descriptor_safe (forwarded);
+ else
+ desc = sgen_obj_get_descriptor_safe (obj);
+
+ sgen_descriptor_count_copied_object (desc);
+ }
+#endif
SGEN_ASSERT (9, obj, "null object from pointer %p", ptr);
SGEN_ASSERT (9, current_collection_generation == GENERATION_OLD, "old gen parallel allocator called from a %d collection", current_collection_generation);