1 /******************************************************************************/
2 #ifdef JEMALLOC_H_TYPES
3
4 typedef struct extent_node_s extent_node_t;
5
6 #endif /* JEMALLOC_H_TYPES */
7 /******************************************************************************/
8 #ifdef JEMALLOC_H_STRUCTS
9
10 /* Tree of extents. Use accessor functions for en_* fields. */
11 struct extent_node_s {
12 /* Arena from which this extent came, if any. */
13 arena_t *en_arena;
14
15 /* Pointer to the extent that this tree node is responsible for. */
16 void *en_addr;
17
18 /* Total region size. */
19 size_t en_size;
20
21 /*
22 * The zeroed flag is used by chunk recycling code to track whether
23 * memory is zero-filled.
24 */
25 bool en_zeroed;
26
27 /*
28 * The achunk flag is used to validate that huge allocation lookups
29 * don't return arena chunks.
30 */
31 bool en_achunk;
32
33 /* Profile counters, used for huge objects. */
34 prof_tctx_t *en_prof_tctx;
35
36 /* Linkage for arena's runs_dirty and chunks_cache rings. */
37 arena_runs_dirty_link_t rd;
38 qr(extent_node_t) cc_link;
39
40 union {
41 /* Linkage for the size/address-ordered tree. */
42 rb_node(extent_node_t) szad_link;
43
44 /* Linkage for arena's huge and node_cache lists. */
45 ql_elm(extent_node_t) ql_link;
46 };
47
48 /* Linkage for the address-ordered tree. */
49 rb_node(extent_node_t) ad_link;
50 };
51 typedef rb_tree(extent_node_t) extent_tree_t;
52
53 #endif /* JEMALLOC_H_STRUCTS */
54 /******************************************************************************/
55 #ifdef JEMALLOC_H_EXTERNS
56
57 rb_proto(, extent_tree_szad_, extent_tree_t, extent_node_t)
58
59 rb_proto(, extent_tree_ad_, extent_tree_t, extent_node_t)
60
61 #endif /* JEMALLOC_H_EXTERNS */
62 /******************************************************************************/
63 #ifdef JEMALLOC_H_INLINES
64
65 #ifndef JEMALLOC_ENABLE_INLINE
66 arena_t *extent_node_arena_get(const extent_node_t *node);
67 void *extent_node_addr_get(const extent_node_t *node);
68 size_t extent_node_size_get(const extent_node_t *node);
69 bool extent_node_zeroed_get(const extent_node_t *node);
70 bool extent_node_achunk_get(const extent_node_t *node);
71 prof_tctx_t *extent_node_prof_tctx_get(const extent_node_t *node);
72 void extent_node_arena_set(extent_node_t *node, arena_t *arena);
73 void extent_node_addr_set(extent_node_t *node, void *addr);
74 void extent_node_size_set(extent_node_t *node, size_t size);
75 void extent_node_zeroed_set(extent_node_t *node, bool zeroed);
76 void extent_node_achunk_set(extent_node_t *node, bool achunk);
77 void extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx);
78 void extent_node_init(extent_node_t *node, arena_t *arena, void *addr,
79 size_t size, bool zeroed);
80 void extent_node_dirty_linkage_init(extent_node_t *node);
81 void extent_node_dirty_insert(extent_node_t *node,
82 arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty);
83 void extent_node_dirty_remove(extent_node_t *node);
84 #endif
85
86 #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_EXTENT_C_))
87 JEMALLOC_INLINE arena_t *
extent_node_arena_get(const extent_node_t * node)88 extent_node_arena_get(const extent_node_t *node)
89 {
90
91 return (node->en_arena);
92 }
93
94 JEMALLOC_INLINE void *
extent_node_addr_get(const extent_node_t * node)95 extent_node_addr_get(const extent_node_t *node)
96 {
97
98 return (node->en_addr);
99 }
100
101 JEMALLOC_INLINE size_t
extent_node_size_get(const extent_node_t * node)102 extent_node_size_get(const extent_node_t *node)
103 {
104
105 return (node->en_size);
106 }
107
108 JEMALLOC_INLINE bool
extent_node_zeroed_get(const extent_node_t * node)109 extent_node_zeroed_get(const extent_node_t *node)
110 {
111
112 return (node->en_zeroed);
113 }
114
115 JEMALLOC_INLINE bool
extent_node_achunk_get(const extent_node_t * node)116 extent_node_achunk_get(const extent_node_t *node)
117 {
118
119 return (node->en_achunk);
120 }
121
122 JEMALLOC_INLINE prof_tctx_t *
extent_node_prof_tctx_get(const extent_node_t * node)123 extent_node_prof_tctx_get(const extent_node_t *node)
124 {
125
126 return (node->en_prof_tctx);
127 }
128
129 JEMALLOC_INLINE void
extent_node_arena_set(extent_node_t * node,arena_t * arena)130 extent_node_arena_set(extent_node_t *node, arena_t *arena)
131 {
132
133 node->en_arena = arena;
134 }
135
136 JEMALLOC_INLINE void
extent_node_addr_set(extent_node_t * node,void * addr)137 extent_node_addr_set(extent_node_t *node, void *addr)
138 {
139
140 node->en_addr = addr;
141 }
142
143 JEMALLOC_INLINE void
extent_node_size_set(extent_node_t * node,size_t size)144 extent_node_size_set(extent_node_t *node, size_t size)
145 {
146
147 node->en_size = size;
148 }
149
150 JEMALLOC_INLINE void
extent_node_zeroed_set(extent_node_t * node,bool zeroed)151 extent_node_zeroed_set(extent_node_t *node, bool zeroed)
152 {
153
154 node->en_zeroed = zeroed;
155 }
156
157 JEMALLOC_INLINE void
extent_node_achunk_set(extent_node_t * node,bool achunk)158 extent_node_achunk_set(extent_node_t *node, bool achunk)
159 {
160
161 node->en_achunk = achunk;
162 }
163
164 JEMALLOC_INLINE void
extent_node_prof_tctx_set(extent_node_t * node,prof_tctx_t * tctx)165 extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx)
166 {
167
168 node->en_prof_tctx = tctx;
169 }
170
171 JEMALLOC_INLINE void
extent_node_init(extent_node_t * node,arena_t * arena,void * addr,size_t size,bool zeroed)172 extent_node_init(extent_node_t *node, arena_t *arena, void *addr, size_t size,
173 bool zeroed)
174 {
175
176 extent_node_arena_set(node, arena);
177 extent_node_addr_set(node, addr);
178 extent_node_size_set(node, size);
179 extent_node_zeroed_set(node, zeroed);
180 extent_node_achunk_set(node, false);
181 if (config_prof)
182 extent_node_prof_tctx_set(node, NULL);
183 }
184
185 JEMALLOC_INLINE void
extent_node_dirty_linkage_init(extent_node_t * node)186 extent_node_dirty_linkage_init(extent_node_t *node)
187 {
188
189 qr_new(&node->rd, rd_link);
190 qr_new(node, cc_link);
191 }
192
193 JEMALLOC_INLINE void
extent_node_dirty_insert(extent_node_t * node,arena_runs_dirty_link_t * runs_dirty,extent_node_t * chunks_dirty)194 extent_node_dirty_insert(extent_node_t *node,
195 arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty)
196 {
197
198 qr_meld(runs_dirty, &node->rd, rd_link);
199 qr_meld(chunks_dirty, node, cc_link);
200 }
201
202 JEMALLOC_INLINE void
extent_node_dirty_remove(extent_node_t * node)203 extent_node_dirty_remove(extent_node_t *node)
204 {
205
206 qr_remove(&node->rd, rd_link);
207 qr_remove(node, cc_link);
208 }
209
210 #endif
211
212 #endif /* JEMALLOC_H_INLINES */
213 /******************************************************************************/
214
215