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