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/sc.h" |
9 | #include "jemalloc/internal/stats.h" |
10 | |
11 | /* Maximum ctl tree depth. */ |
12 | #define CTL_MAX_DEPTH 7 |
13 | |
14 | typedef struct ctl_node_s { |
15 | bool named; |
16 | } ctl_node_t; |
17 | |
18 | typedef 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 | |
28 | typedef 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 | |
34 | typedef 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 | uint64_t nfills_small; |
43 | uint64_t nflushes_small; |
44 | |
45 | bin_stats_data_t bstats[SC_NBINS]; |
46 | arena_stats_large_t lstats[SC_NSIZES - SC_NBINS]; |
47 | pac_estats_t estats[SC_NPSIZES]; |
48 | hpa_shard_stats_t hpastats; |
49 | sec_stats_t secstats; |
50 | } ctl_arena_stats_t; |
51 | |
52 | typedef struct ctl_stats_s { |
53 | size_t allocated; |
54 | size_t active; |
55 | size_t metadata; |
56 | size_t metadata_thp; |
57 | size_t resident; |
58 | size_t mapped; |
59 | size_t retained; |
60 | |
61 | background_thread_stats_t background_thread; |
62 | mutex_prof_data_t mutex_prof_data[mutex_prof_num_global_mutexes]; |
63 | } ctl_stats_t; |
64 | |
65 | typedef struct ctl_arena_s ctl_arena_t; |
66 | struct ctl_arena_s { |
67 | unsigned arena_ind; |
68 | bool initialized; |
69 | ql_elm(ctl_arena_t) destroyed_link; |
70 | |
71 | /* Basic stats, supported even if !config_stats. */ |
72 | unsigned nthreads; |
73 | const char *dss; |
74 | ssize_t dirty_decay_ms; |
75 | ssize_t muzzy_decay_ms; |
76 | size_t pactive; |
77 | size_t pdirty; |
78 | size_t pmuzzy; |
79 | |
80 | /* NULL if !config_stats. */ |
81 | ctl_arena_stats_t *astats; |
82 | }; |
83 | |
84 | typedef struct ctl_arenas_s { |
85 | uint64_t epoch; |
86 | unsigned narenas; |
87 | ql_head(ctl_arena_t) destroyed; |
88 | |
89 | /* |
90 | * Element 0 corresponds to merged stats for extant arenas (accessed via |
91 | * MALLCTL_ARENAS_ALL), element 1 corresponds to merged stats for |
92 | * destroyed arenas (accessed via MALLCTL_ARENAS_DESTROYED), and the |
93 | * remaining MALLOCX_ARENA_LIMIT elements correspond to arenas. |
94 | */ |
95 | ctl_arena_t *arenas[2 + MALLOCX_ARENA_LIMIT]; |
96 | } ctl_arenas_t; |
97 | |
98 | int ctl_byname(tsd_t *tsd, const char *name, void *oldp, size_t *oldlenp, |
99 | void *newp, size_t newlen); |
100 | int ctl_nametomib(tsd_t *tsd, const char *name, size_t *mibp, size_t *miblenp); |
101 | int ctl_bymib(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp, |
102 | size_t *oldlenp, void *newp, size_t newlen); |
103 | int ctl_mibnametomib(tsd_t *tsd, size_t *mib, size_t miblen, const char *name, |
104 | size_t *miblenp); |
105 | int ctl_bymibname(tsd_t *tsd, size_t *mib, size_t miblen, const char *name, |
106 | size_t *miblenp, void *oldp, size_t *oldlenp, void *newp, size_t newlen); |
107 | bool ctl_boot(void); |
108 | void ctl_prefork(tsdn_t *tsdn); |
109 | void ctl_postfork_parent(tsdn_t *tsdn); |
110 | void ctl_postfork_child(tsdn_t *tsdn); |
111 | void ctl_mtx_assert_held(tsdn_t *tsdn); |
112 | |
113 | #define xmallctl(name, oldp, oldlenp, newp, newlen) do { \ |
114 | if (je_mallctl(name, oldp, oldlenp, newp, newlen) \ |
115 | != 0) { \ |
116 | malloc_printf( \ |
117 | "<jemalloc>: Failure in xmallctl(\"%s\", ...)\n", \ |
118 | name); \ |
119 | abort(); \ |
120 | } \ |
121 | } while (0) |
122 | |
123 | #define xmallctlnametomib(name, mibp, miblenp) do { \ |
124 | if (je_mallctlnametomib(name, mibp, miblenp) != 0) { \ |
125 | malloc_printf("<jemalloc>: Failure in " \ |
126 | "xmallctlnametomib(\"%s\", ...)\n", name); \ |
127 | abort(); \ |
128 | } \ |
129 | } while (0) |
130 | |
131 | #define xmallctlbymib(mib, miblen, oldp, oldlenp, newp, newlen) do { \ |
132 | if (je_mallctlbymib(mib, miblen, oldp, oldlenp, newp, \ |
133 | newlen) != 0) { \ |
134 | malloc_write( \ |
135 | "<jemalloc>: Failure in xmallctlbymib()\n"); \ |
136 | abort(); \ |
137 | } \ |
138 | } while (0) |
139 | |
140 | #define xmallctlmibnametomib(mib, miblen, name, miblenp) do { \ |
141 | if (ctl_mibnametomib(tsd_fetch(), mib, miblen, name, miblenp) \ |
142 | != 0) { \ |
143 | malloc_write( \ |
144 | "<jemalloc>: Failure in ctl_mibnametomib()\n"); \ |
145 | abort(); \ |
146 | } \ |
147 | } while (0) |
148 | |
149 | #define xmallctlbymibname(mib, miblen, name, miblenp, oldp, oldlenp, \ |
150 | newp, newlen) do { \ |
151 | if (ctl_bymibname(tsd_fetch(), mib, miblen, name, miblenp, \ |
152 | oldp, oldlenp, newp, newlen) != 0) { \ |
153 | malloc_write( \ |
154 | "<jemalloc>: Failure in ctl_bymibname()\n"); \ |
155 | abort(); \ |
156 | } \ |
157 | } while (0) |
158 | |
159 | #endif /* JEMALLOC_INTERNAL_CTL_H */ |
160 | |