X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-pinning-stats.c;h=f98158077b88e507cefb1e47ed8a96cd4a464af3;hb=a9b5b501fd36a4b488e2295196a52778b2b94d1f;hp=5edccfaabec10720fcb6658f1eb8e7d54b8ccc24;hpb=e137ff6f7e2594d3ce96b4c74b528d26cc80e11d;p=mono.git diff --git a/mono/sgen/sgen-pinning-stats.c b/mono/sgen/sgen-pinning-stats.c index 5edccfaabec..f98158077b8 100644 --- a/mono/sgen/sgen-pinning-stats.c +++ b/mono/sgen/sgen-pinning-stats.c @@ -1,26 +1,10 @@ -/* +/** + * \file * Copyright 2001-2003 Ximian, Inc * Copyright 2003-2010 Novell, Inc. * Copyright 2011 Xamarin Inc (http://www.xamarin.com) * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include "config.h" @@ -54,6 +38,9 @@ static gboolean do_pin_stats = FALSE; static PinStatAddress *pin_stat_addresses = NULL; static size_t pinned_byte_counts [PIN_TYPE_MAX]; +static size_t pinned_bytes_in_generation [GENERATION_MAX]; +static int pinned_objects_in_generation [GENERATION_MAX]; + static SgenPointerQueue pinned_objects = SGEN_POINTER_QUEUE_INIT (INTERNAL_MEM_STATISTICS); static SgenHashTable pinned_class_hash_table = SGEN_HASH_TABLE_INIT (INTERNAL_MEM_STATISTICS, INTERNAL_MEM_STAT_PINNED_CLASS, sizeof (PinnedClassEntry), g_str_hash, g_str_equal); @@ -83,6 +70,10 @@ sgen_pin_stats_reset (void) pin_stat_addresses = NULL; for (i = 0; i < PIN_TYPE_MAX; ++i) pinned_byte_counts [i] = 0; + for (i = 0; i < GENERATION_MAX; ++i) { + pinned_bytes_in_generation [i] = 0; + pinned_objects_in_generation [i] = 0; + } sgen_pointer_queue_clear (&pinned_objects); sgen_hash_table_clean (&pinned_class_hash_table); sgen_hash_table_clean (&global_remset_class_hash_table); @@ -95,6 +86,8 @@ sgen_pin_stats_register_address (char *addr, int pin_type) PinStatAddress *node; int pin_type_bit = 1 << pin_type; + if (!do_pin_stats) + return; while (*node_ptr) { node = *node_ptr; if (addr == node->addr) { @@ -170,13 +163,23 @@ register_vtable (GCVTable vtable, int pin_types) } void -sgen_pin_stats_register_object (GCObject *obj, size_t size) +sgen_pin_stats_register_object (GCObject *obj, int generation) { int pin_types = 0; + size_t size = 0; + + if (binary_protocol_is_enabled ()) { + size = sgen_safe_object_get_size (obj); + pinned_bytes_in_generation [generation] += size; + ++pinned_objects_in_generation [generation]; + } if (!do_pin_stats) return; + if (!size) + size = sgen_safe_object_get_size (obj); + pin_stats_count_object_from_tree (obj, size, pin_stat_addresses, &pin_types); sgen_pointer_queue_add (&pinned_objects, obj); @@ -200,12 +203,15 @@ sgen_pin_stats_register_global_remset (GCObject *obj) } void -sgen_pin_stats_print_class_stats (void) +sgen_pin_stats_report (void) { char *name; PinnedClassEntry *pinned_entry; GlobalRemsetClassEntry *remset_entry; + binary_protocol_pin_stats (pinned_objects_in_generation [GENERATION_NURSERY], pinned_bytes_in_generation [GENERATION_NURSERY], + pinned_objects_in_generation [GENERATION_OLD], pinned_bytes_in_generation [GENERATION_OLD]); + if (!do_pin_stats) return;