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 malloc_huge_stats_s malloc_huge_stats_t; 8 typedef struct arena_stats_s arena_stats_t; 9 typedef struct chunk_stats_s chunk_stats_t; 10 11 #endif /* JEMALLOC_H_TYPES */ 12 /******************************************************************************/ 13 #ifdef JEMALLOC_H_STRUCTS 14 15 struct tcache_bin_stats_s { 16 /* 17 * Number of allocation requests that corresponded to the size of this 18 * bin. 19 */ 20 uint64_t nrequests; 21 }; 22 23 struct malloc_bin_stats_s { 24 /* 25 * Total number of allocation/deallocation requests served directly by 26 * the bin. Note that tcache may allocate an object, then recycle it 27 * many times, resulting many increments to nrequests, but only one 28 * each to nmalloc and ndalloc. 29 */ 30 uint64_t nmalloc; 31 uint64_t ndalloc; 32 33 /* 34 * Number of allocation requests that correspond to the size of this 35 * bin. This includes requests served by tcache, though tcache only 36 * periodically merges into this counter. 37 */ 38 uint64_t nrequests; 39 40 /* 41 * Current number of regions of this size class, including regions 42 * currently cached by tcache. 43 */ 44 size_t curregs; 45 46 /* Number of tcache fills from this bin. */ 47 uint64_t nfills; 48 49 /* Number of tcache flushes to this bin. */ 50 uint64_t nflushes; 51 52 /* Total number of runs created for this bin's size class. */ 53 uint64_t nruns; 54 55 /* 56 * Total number of runs reused by extracting them from the runs tree for 57 * this bin's size class. 58 */ 59 uint64_t reruns; 60 61 /* Current number of runs in this bin. */ 62 size_t curruns; 63 }; 64 65 struct malloc_large_stats_s { 66 /* 67 * Total number of allocation/deallocation requests served directly by 68 * the arena. Note that tcache may allocate an object, then recycle it 69 * many times, resulting many increments to nrequests, but only one 70 * each to nmalloc and ndalloc. 71 */ 72 uint64_t nmalloc; 73 uint64_t ndalloc; 74 75 /* 76 * Number of allocation requests that correspond to this size class. 77 * This includes requests served by tcache, though tcache only 78 * periodically merges into this counter. 79 */ 80 uint64_t nrequests; 81 82 /* 83 * Current number of runs of this size class, including runs currently 84 * cached by tcache. 85 */ 86 size_t curruns; 87 }; 88 89 struct malloc_huge_stats_s { 90 /* 91 * Total number of allocation/deallocation requests served directly by 92 * the arena. 93 */ 94 uint64_t nmalloc; 95 uint64_t ndalloc; 96 97 /* Current number of (multi-)chunk allocations of this size class. */ 98 size_t curhchunks; 99 }; 100 101 struct arena_stats_s { 102 /* Number of bytes currently mapped. */ 103 size_t mapped; 104 105 /* 106 * Number of bytes currently retained as a side effect of munmap() being 107 * disabled/bypassed. Retained bytes are technically mapped (though 108 * always decommitted or purged), but they are excluded from the mapped 109 * statistic (above). 110 */ 111 size_t retained; 112 113 /* 114 * Total number of purge sweeps, total number of madvise calls made, 115 * and total pages purged in order to keep dirty unused memory under 116 * control. 117 */ 118 uint64_t npurge; 119 uint64_t nmadvise; 120 uint64_t purged; 121 122 /* 123 * Number of bytes currently mapped purely for metadata purposes, and 124 * number of bytes currently allocated for internal metadata. 125 */ 126 size_t metadata_mapped; 127 size_t metadata_allocated; /* Protected via atomic_*_z(). */ 128 129 /* Per-size-category statistics. */ 130 size_t allocated_large; 131 uint64_t nmalloc_large; 132 uint64_t ndalloc_large; 133 uint64_t nrequests_large; 134 135 size_t allocated_huge; 136 uint64_t nmalloc_huge; 137 uint64_t ndalloc_huge; 138 139 /* One element for each large size class. */ 140 malloc_large_stats_t *lstats; 141 142 /* One element for each huge size class. */ 143 malloc_huge_stats_t *hstats; 144 }; 145 146 #endif /* JEMALLOC_H_STRUCTS */ 147 /******************************************************************************/ 148 #ifdef JEMALLOC_H_EXTERNS 149 150 extern bool opt_stats_print; 151 152 extern size_t stats_cactive; 153 154 void stats_print(void (*write)(void *, const char *), void *cbopaque, 155 const char *opts); 156 157 #endif /* JEMALLOC_H_EXTERNS */ 158 /******************************************************************************/ 159 #ifdef JEMALLOC_H_INLINES 160 161 #ifndef JEMALLOC_ENABLE_INLINE 162 size_t stats_cactive_get(void); 163 void stats_cactive_add(size_t size); 164 void stats_cactive_sub(size_t size); 165 #endif 166 167 #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_STATS_C_)) 168 JEMALLOC_INLINE size_t 169 stats_cactive_get(void) 170 { 171 172 return (atomic_read_z(&stats_cactive)); 173 } 174 175 JEMALLOC_INLINE void 176 stats_cactive_add(size_t size) 177 { 178 179 assert(size > 0); 180 assert((size & chunksize_mask) == 0); 181 182 atomic_add_z(&stats_cactive, size); 183 } 184 185 JEMALLOC_INLINE void 186 stats_cactive_sub(size_t size) 187 { 188 189 assert(size > 0); 190 assert((size & chunksize_mask) == 0); 191 192 atomic_sub_z(&stats_cactive, size); 193 } 194 #endif 195 196 #endif /* JEMALLOC_H_INLINES */ 197 /******************************************************************************/ 198