1#ifndef JEMALLOC_INTERNAL_CTL_H 2#define JEMALLOC_INTERNAL_CTL_H 3 4#include "jemalloc/internal/jemalloc_internal_types.h" 5#include "jemalloc/internal/malloc_io.h" 6#include "jemalloc/internal/mutex_prof.h" 7#include "jemalloc/internal/ql.h" 8#include "jemalloc/internal/size_classes.h" 9#include "jemalloc/internal/stats.h" 10 11/* Maximum ctl tree depth. */ 12#define CTL_MAX_DEPTH 7 13 14typedef struct ctl_node_s { 15 bool named; 16} ctl_node_t; 17 18typedef struct ctl_named_node_s { 19 ctl_node_t node; 20 const char *name; 21 /* If (nchildren == 0), this is a terminal node. */ 22 size_t nchildren; 23 const ctl_node_t *children; 24 int (*ctl)(tsd_t *, const size_t *, size_t, void *, size_t *, void *, 25 size_t); 26} ctl_named_node_t; 27 28typedef struct ctl_indexed_node_s { 29 struct ctl_node_s node; 30 const ctl_named_node_t *(*index)(tsdn_t *, const size_t *, size_t, 31 size_t); 32} ctl_indexed_node_t; 33 34typedef struct ctl_arena_stats_s { 35 arena_stats_t astats; 36 37 /* Aggregate stats for small size classes, based on bin stats. */ 38 size_t allocated_small; 39 uint64_t nmalloc_small; 40 uint64_t ndalloc_small; 41 uint64_t nrequests_small; 42 43 bin_stats_t bstats[NBINS]; 44 arena_stats_large_t lstats[NSIZES - NBINS]; 45} ctl_arena_stats_t; 46 47typedef struct ctl_stats_s { 48 size_t allocated; 49 size_t active; 50 size_t metadata; 51 size_t metadata_thp; 52 size_t resident; 53 size_t mapped; 54 size_t retained; 55 56 background_thread_stats_t background_thread; 57 mutex_prof_data_t mutex_prof_data[mutex_prof_num_global_mutexes]; 58} ctl_stats_t; 59 60typedef struct ctl_arena_s ctl_arena_t; 61struct ctl_arena_s { 62 unsigned arena_ind; 63 bool initialized; 64 ql_elm(ctl_arena_t) destroyed_link; 65 66 /* Basic stats, supported even if !config_stats. */ 67 unsigned nthreads; 68 const char *dss; 69 ssize_t dirty_decay_ms; 70 ssize_t muzzy_decay_ms; 71 size_t pactive; 72 size_t pdirty; 73 size_t pmuzzy; 74 75 /* NULL if !config_stats. */ 76 ctl_arena_stats_t *astats; 77}; 78 79typedef struct ctl_arenas_s { 80 uint64_t epoch; 81 unsigned narenas; 82 ql_head(ctl_arena_t) destroyed; 83 84 /* 85 * Element 0 corresponds to merged stats for extant arenas (accessed via 86 * MALLCTL_ARENAS_ALL), element 1 corresponds to merged stats for 87 * destroyed arenas (accessed via MALLCTL_ARENAS_DESTROYED), and the 88 * remaining MALLOCX_ARENA_LIMIT elements correspond to arenas. 89 */ 90 ctl_arena_t *arenas[2 + MALLOCX_ARENA_LIMIT]; 91} ctl_arenas_t; 92 93int ctl_byname(tsd_t *tsd, const char *name, void *oldp, size_t *oldlenp, 94 void *newp, size_t newlen); 95int ctl_nametomib(tsd_t *tsd, const char *name, size_t *mibp, size_t *miblenp); 96 97int ctl_bymib(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp, 98 size_t *oldlenp, void *newp, size_t newlen); 99bool ctl_boot(void); 100void ctl_prefork(tsdn_t *tsdn); 101void ctl_postfork_parent(tsdn_t *tsdn); 102void ctl_postfork_child(tsdn_t *tsdn); 103 104#define xmallctl(name, oldp, oldlenp, newp, newlen) do { \ 105 if (je_mallctl(name, oldp, oldlenp, newp, newlen) \ 106 != 0) { \ 107 malloc_printf( \ 108 "<jemalloc>: Failure in xmallctl(\"%s\", ...)\n", \ 109 name); \ 110 abort(); \ 111 } \ 112} while (0) 113 114#define xmallctlnametomib(name, mibp, miblenp) do { \ 115 if (je_mallctlnametomib(name, mibp, miblenp) != 0) { \ 116 malloc_printf("<jemalloc>: Failure in " \ 117 "xmallctlnametomib(\"%s\", ...)\n", name); \ 118 abort(); \ 119 } \ 120} while (0) 121 122#define xmallctlbymib(mib, miblen, oldp, oldlenp, newp, newlen) do { \ 123 if (je_mallctlbymib(mib, miblen, oldp, oldlenp, newp, \ 124 newlen) != 0) { \ 125 malloc_write( \ 126 "<jemalloc>: Failure in xmallctlbymib()\n"); \ 127 abort(); \ 128 } \ 129} while (0) 130 131#endif /* JEMALLOC_INTERNAL_CTL_H */ 132