Home | History | Annotate | Download | only in internal
      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
    156 stats_cactive_get(void)
    157 {
    158 
    159 	return (atomic_read_z(&stats_cactive));
    160 }
    161 
    162 JEMALLOC_INLINE void
    163 stats_cactive_add(size_t size)
    164 {
    165 
    166 	atomic_add_z(&stats_cactive, size);
    167 }
    168 
    169 JEMALLOC_INLINE void
    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