1 /******************************************************************************/
2 #ifdef JEMALLOC_H_TYPES
3
4 typedef struct tcache_bin_stats_s tcache_bin_stats_t;
5 typedef struct malloc_bin_stats_s malloc_bin_stats_t;
6 typedef struct malloc_large_stats_s malloc_large_stats_t;
7 typedef struct arena_stats_s arena_stats_t;
8 typedef struct chunk_stats_s chunk_stats_t;
9
10 #endif /* JEMALLOC_H_TYPES */
11 /******************************************************************************/
12 #ifdef JEMALLOC_H_STRUCTS
13
14 struct tcache_bin_stats_s {
15 /*
16 * Number of allocation requests that corresponded to the size of this
17 * bin.
18 */
19 uint64_t nrequests;
20 };
21
22 struct malloc_bin_stats_s {
23 /*
24 * Current number of bytes allocated, including objects currently
25 * cached by tcache.
26 */
27 size_t allocated;
28
29 /*
30 * Total number of allocation/deallocation requests served directly by
31 * the bin. Note that tcache may allocate an object, then recycle it
32 * many times, resulting many increments to nrequests, but only one
33 * each to nmalloc and ndalloc.
34 */
35 uint64_t nmalloc;
36 uint64_t ndalloc;
37
38 /*
39 * Number of allocation requests that correspond to the size of this
40 * bin. This includes requests served by tcache, though tcache only
41 * periodically merges into this counter.
42 */
43 uint64_t nrequests;
44
45 /* Number of tcache fills from this bin. */
46 uint64_t nfills;
47
48 /* Number of tcache flushes to this bin. */
49 uint64_t nflushes;
50
51 /* Total number of runs created for this bin's size class. */
52 uint64_t nruns;
53
54 /*
55 * Total number of runs reused by extracting them from the runs tree for
56 * this bin's size class.
57 */
58 uint64_t reruns;
59
60 /* Current number of runs in this bin. */
61 size_t curruns;
62 };
63
64 struct malloc_large_stats_s {
65 /*
66 * Total number of allocation/deallocation requests served directly by
67 * the arena. Note that tcache may allocate an object, then recycle it
68 * many times, resulting many increments to nrequests, but only one
69 * each to nmalloc and ndalloc.
70 */
71 uint64_t nmalloc;
72 uint64_t ndalloc;
73
74 /*
75 * Number of allocation requests that correspond to this size class.
76 * This includes requests served by tcache, though tcache only
77 * periodically merges into this counter.
78 */
79 uint64_t nrequests;
80
81 /* Current number of runs of this size class. */
82 size_t curruns;
83 };
84
85 struct arena_stats_s {
86 /* Number of bytes currently mapped. */
87 size_t mapped;
88
89 /*
90 * Total number of purge sweeps, total number of madvise calls made,
91 * and total pages purged in order to keep dirty unused memory under
92 * control.
93 */
94 uint64_t npurge;
95 uint64_t nmadvise;
96 uint64_t purged;
97
98 /* Per-size-category statistics. */
99 size_t allocated_large;
100 uint64_t nmalloc_large;
101 uint64_t ndalloc_large;
102 uint64_t nrequests_large;
103
104 size_t allocated_huge;
105 uint64_t nmalloc_huge;
106 uint64_t ndalloc_huge;
107 uint64_t nrequests_huge;
108
109 /*
110 * One element for each possible size class, including sizes that
111 * overlap with bin size classes. This is necessary because ipalloc()
112 * sometimes has to use such large objects in order to assure proper
113 * alignment.
114 */
115 malloc_large_stats_t *lstats;
116 };
117
118 struct chunk_stats_s {
119 /* Number of chunks that were allocated. */
120 uint64_t nchunks;
121
122 /* High-water mark for number of chunks allocated. */
123 size_t highchunks;
124
125 /*
126 * Current number of chunks allocated. This value isn't maintained for
127 * any other purpose, so keep track of it in order to be able to set
128 * highchunks.
129 */
130 size_t curchunks;
131 };
132
133 #endif /* JEMALLOC_H_STRUCTS */
134 /******************************************************************************/
135 #ifdef JEMALLOC_H_EXTERNS
136
137 extern bool opt_stats_print;
138
139 extern size_t stats_cactive;
140
141 void stats_print(void (*write)(void *, const char *), void *cbopaque,
142 const char *opts);
143
144 #endif /* JEMALLOC_H_EXTERNS */
145 /******************************************************************************/
146 #ifdef JEMALLOC_H_INLINES
147
148 #ifndef JEMALLOC_ENABLE_INLINE
149 size_t stats_cactive_get(void);
150 void stats_cactive_add(size_t size);
151 void stats_cactive_sub(size_t size);
152 #endif
153
154 #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_STATS_C_))
155 JEMALLOC_INLINE size_t
stats_cactive_get(void)156 stats_cactive_get(void)
157 {
158
159 return (atomic_read_z(&stats_cactive));
160 }
161
162 JEMALLOC_INLINE void
stats_cactive_add(size_t size)163 stats_cactive_add(size_t size)
164 {
165
166 atomic_add_z(&stats_cactive, size);
167 }
168
169 JEMALLOC_INLINE void
stats_cactive_sub(size_t size)170 stats_cactive_sub(size_t size)
171 {
172
173 atomic_sub_z(&stats_cactive, size);
174 }
175 #endif
176
177 #endif /* JEMALLOC_H_INLINES */
178 /******************************************************************************/
179