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