8 typedef struct _PinStatAddress PinStatAddress;
9 struct _PinStatAddress {
13 PinStatAddress *right;
16 static PinStatAddress *pin_stat_addresses = NULL;
17 static size_t pinned_byte_counts [PIN_TYPE_MAX];
20 pin_stats_tree_free (PinStatAddress *node)
24 pin_stats_tree_free (node->left);
25 pin_stats_tree_free (node->right);
26 free_internal_mem (node, INTERNAL_MEM_STATISTICS);
30 pin_stats_reset (void)
33 pin_stats_tree_free (pin_stat_addresses);
34 pin_stat_addresses = NULL;
35 for (i = 0; i < PIN_TYPE_MAX; ++i)
36 pinned_byte_counts [i] = 0;
40 pin_stats_register_address (char *addr, int pin_type)
42 PinStatAddress **node_ptr = &pin_stat_addresses;
44 int pin_type_bit = 1 << pin_type;
48 if (addr == node->addr) {
49 node->pin_types |= pin_type_bit;
52 if (addr < node->addr)
53 node_ptr = &node->left;
55 node_ptr = &node->right;
58 node = get_internal_mem (sizeof (PinStatAddress), INTERNAL_MEM_STATISTICS);
60 node->pin_types = pin_type_bit;
61 node->left = node->right = NULL;
67 pin_stats_count_object_from_tree (char *obj, size_t size, PinStatAddress *node, int *pin_types)
71 if (node->addr >= obj && node->addr < obj + size) {
73 for (i = 0; i < PIN_TYPE_MAX; ++i) {
75 if (!(*pin_types & pin_bit) && (node->pin_types & pin_bit)) {
76 pinned_byte_counts [i] += size;
77 *pin_types |= pin_bit;
82 pin_stats_count_object_from_tree (obj, size, node->left, pin_types);
83 if (obj + size - 1 > node->addr)
84 pin_stats_count_object_from_tree (obj, size, node->right, pin_types);
88 pin_stats_register_object (char *obj, size_t size)
91 pin_stats_count_object_from_tree (obj, size, pin_stat_addresses, &pin_types);