1/******************************************************************************/
2#ifdef JEMALLOC_H_TYPES
3
4typedef 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. */
11struct 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	 * True if physical memory is committed to the extent, whether
29	 * explicitly or implicitly as on a system that overcommits and
30	 * satisfies physical memory needs on demand via soft page faults.
31	 */
32	bool			en_committed;
33
34	/*
35	 * The achunk flag is used to validate that huge allocation lookups
36	 * don't return arena chunks.
37	 */
38	bool			en_achunk;
39
40	/* Profile counters, used for huge objects. */
41	prof_tctx_t		*en_prof_tctx;
42
43	/* Linkage for arena's runs_dirty and chunks_cache rings. */
44	arena_runs_dirty_link_t	rd;
45	qr(extent_node_t)	cc_link;
46
47	union {
48		/* Linkage for the size/address-ordered tree. */
49		rb_node(extent_node_t)	szad_link;
50
51		/* Linkage for arena's achunks, huge, and node_cache lists. */
52		ql_elm(extent_node_t)	ql_link;
53	};
54
55	/* Linkage for the address-ordered tree. */
56	rb_node(extent_node_t)	ad_link;
57};
58typedef rb_tree(extent_node_t) extent_tree_t;
59
60#endif /* JEMALLOC_H_STRUCTS */
61/******************************************************************************/
62#ifdef JEMALLOC_H_EXTERNS
63
64rb_proto(, extent_tree_szad_, extent_tree_t, extent_node_t)
65
66rb_proto(, extent_tree_ad_, extent_tree_t, extent_node_t)
67
68#endif /* JEMALLOC_H_EXTERNS */
69/******************************************************************************/
70#ifdef JEMALLOC_H_INLINES
71
72#ifndef JEMALLOC_ENABLE_INLINE
73arena_t	*extent_node_arena_get(const extent_node_t *node);
74void	*extent_node_addr_get(const extent_node_t *node);
75size_t	extent_node_size_get(const extent_node_t *node);
76bool	extent_node_zeroed_get(const extent_node_t *node);
77bool	extent_node_committed_get(const extent_node_t *node);
78bool	extent_node_achunk_get(const extent_node_t *node);
79prof_tctx_t	*extent_node_prof_tctx_get(const extent_node_t *node);
80void	extent_node_arena_set(extent_node_t *node, arena_t *arena);
81void	extent_node_addr_set(extent_node_t *node, void *addr);
82void	extent_node_size_set(extent_node_t *node, size_t size);
83void	extent_node_zeroed_set(extent_node_t *node, bool zeroed);
84void	extent_node_committed_set(extent_node_t *node, bool committed);
85void	extent_node_achunk_set(extent_node_t *node, bool achunk);
86void	extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx);
87void	extent_node_init(extent_node_t *node, arena_t *arena, void *addr,
88    size_t size, bool zeroed, bool committed);
89void	extent_node_dirty_linkage_init(extent_node_t *node);
90void	extent_node_dirty_insert(extent_node_t *node,
91    arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty);
92void	extent_node_dirty_remove(extent_node_t *node);
93#endif
94
95#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_EXTENT_C_))
96JEMALLOC_INLINE arena_t *
97extent_node_arena_get(const extent_node_t *node)
98{
99
100	return (node->en_arena);
101}
102
103JEMALLOC_INLINE void *
104extent_node_addr_get(const extent_node_t *node)
105{
106
107	return (node->en_addr);
108}
109
110JEMALLOC_INLINE size_t
111extent_node_size_get(const extent_node_t *node)
112{
113
114	return (node->en_size);
115}
116
117JEMALLOC_INLINE bool
118extent_node_zeroed_get(const extent_node_t *node)
119{
120
121	return (node->en_zeroed);
122}
123
124JEMALLOC_INLINE bool
125extent_node_committed_get(const extent_node_t *node)
126{
127
128	assert(!node->en_achunk);
129	return (node->en_committed);
130}
131
132JEMALLOC_INLINE bool
133extent_node_achunk_get(const extent_node_t *node)
134{
135
136	return (node->en_achunk);
137}
138
139JEMALLOC_INLINE prof_tctx_t *
140extent_node_prof_tctx_get(const extent_node_t *node)
141{
142
143	return (node->en_prof_tctx);
144}
145
146JEMALLOC_INLINE void
147extent_node_arena_set(extent_node_t *node, arena_t *arena)
148{
149
150	node->en_arena = arena;
151}
152
153JEMALLOC_INLINE void
154extent_node_addr_set(extent_node_t *node, void *addr)
155{
156
157	node->en_addr = addr;
158}
159
160JEMALLOC_INLINE void
161extent_node_size_set(extent_node_t *node, size_t size)
162{
163
164	node->en_size = size;
165}
166
167JEMALLOC_INLINE void
168extent_node_zeroed_set(extent_node_t *node, bool zeroed)
169{
170
171	node->en_zeroed = zeroed;
172}
173
174JEMALLOC_INLINE void
175extent_node_committed_set(extent_node_t *node, bool committed)
176{
177
178	node->en_committed = committed;
179}
180
181JEMALLOC_INLINE void
182extent_node_achunk_set(extent_node_t *node, bool achunk)
183{
184
185	node->en_achunk = achunk;
186}
187
188JEMALLOC_INLINE void
189extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx)
190{
191
192	node->en_prof_tctx = tctx;
193}
194
195JEMALLOC_INLINE void
196extent_node_init(extent_node_t *node, arena_t *arena, void *addr, size_t size,
197    bool zeroed, bool committed)
198{
199
200	extent_node_arena_set(node, arena);
201	extent_node_addr_set(node, addr);
202	extent_node_size_set(node, size);
203	extent_node_zeroed_set(node, zeroed);
204	extent_node_committed_set(node, committed);
205	extent_node_achunk_set(node, false);
206	if (config_prof)
207		extent_node_prof_tctx_set(node, NULL);
208}
209
210JEMALLOC_INLINE void
211extent_node_dirty_linkage_init(extent_node_t *node)
212{
213
214	qr_new(&node->rd, rd_link);
215	qr_new(node, cc_link);
216}
217
218JEMALLOC_INLINE void
219extent_node_dirty_insert(extent_node_t *node,
220    arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty)
221{
222
223	qr_meld(runs_dirty, &node->rd, rd_link);
224	qr_meld(chunks_dirty, node, cc_link);
225}
226
227JEMALLOC_INLINE void
228extent_node_dirty_remove(extent_node_t *node)
229{
230
231	qr_remove(&node->rd, rd_link);
232	qr_remove(node, cc_link);
233}
234
235#endif
236
237#endif /* JEMALLOC_H_INLINES */
238/******************************************************************************/
239
240