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
);