1e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#define	JEMALLOC_EXTENT_C_
2376b1529a383c39adf4674baf6db83a5e63f97acJason Evans#include "jemalloc/internal/jemalloc_internal.h"
3e476f8a161d445211fd6e54fe370275196e66bcbJason Evans
4e476f8a161d445211fd6e54fe370275196e66bcbJason Evans/******************************************************************************/
5e476f8a161d445211fd6e54fe370275196e66bcbJason Evans
62fac34167bd714e512851d346b1e3acbf2bc2d55Jason EvansJEMALLOC_INLINE_C size_t
72fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evansextent_quantize(size_t size)
82fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans{
92fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans
102fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans	/*
112fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans	 * Round down to the nearest chunk size that can actually be requested
122fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans	 * during normal huge allocation.
132fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans	 */
142fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans	return (index2size(size2index(size + 1) - 1));
152fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans}
162fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans
1783e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher FerrisJEMALLOC_INLINE_C int
18e476f8a161d445211fd6e54fe370275196e66bcbJason Evansextent_szad_comp(extent_node_t *a, extent_node_t *b)
19e476f8a161d445211fd6e54fe370275196e66bcbJason Evans{
20e476f8a161d445211fd6e54fe370275196e66bcbJason Evans	int ret;
212fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans	size_t a_qsize = extent_quantize(extent_node_size_get(a));
222fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans	size_t b_qsize = extent_quantize(extent_node_size_get(b));
232fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans
2483e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferris	/*
252fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans	 * Compare based on quantized size rather than size, in order to sort
262fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans	 * equally useful extents only by address.
2783e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferris	 */
282fac34167bd714e512851d346b1e3acbf2bc2d55Jason Evans	ret = (a_qsize > b_qsize) - (a_qsize < b_qsize);
29e476f8a161d445211fd6e54fe370275196e66bcbJason Evans	if (ret == 0) {
3083e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferris		uintptr_t a_addr = (uintptr_t)extent_node_addr_get(a);
3183e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferris		uintptr_t b_addr = (uintptr_t)extent_node_addr_get(b);
32e476f8a161d445211fd6e54fe370275196e66bcbJason Evans
33e476f8a161d445211fd6e54fe370275196e66bcbJason Evans		ret = (a_addr > b_addr) - (a_addr < b_addr);
34e476f8a161d445211fd6e54fe370275196e66bcbJason Evans	}
35e476f8a161d445211fd6e54fe370275196e66bcbJason Evans
36e476f8a161d445211fd6e54fe370275196e66bcbJason Evans	return (ret);
37e476f8a161d445211fd6e54fe370275196e66bcbJason Evans}
38e476f8a161d445211fd6e54fe370275196e66bcbJason Evans
39f3ff75289be32382fa455b4436871e4958fe6bf9Jason Evans/* Generate red-black tree functions. */
4083e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferrisrb_gen(, extent_tree_szad_, extent_tree_t, extent_node_t, szad_link,
41e476f8a161d445211fd6e54fe370275196e66bcbJason Evans    extent_szad_comp)
42e476f8a161d445211fd6e54fe370275196e66bcbJason Evans
4383e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher FerrisJEMALLOC_INLINE_C int
44e476f8a161d445211fd6e54fe370275196e66bcbJason Evansextent_ad_comp(extent_node_t *a, extent_node_t *b)
45e476f8a161d445211fd6e54fe370275196e66bcbJason Evans{
4683e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferris	uintptr_t a_addr = (uintptr_t)extent_node_addr_get(a);
4783e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferris	uintptr_t b_addr = (uintptr_t)extent_node_addr_get(b);
48e476f8a161d445211fd6e54fe370275196e66bcbJason Evans
49e476f8a161d445211fd6e54fe370275196e66bcbJason Evans	return ((a_addr > b_addr) - (a_addr < b_addr));
50e476f8a161d445211fd6e54fe370275196e66bcbJason Evans}
51e476f8a161d445211fd6e54fe370275196e66bcbJason Evans
52f3ff75289be32382fa455b4436871e4958fe6bf9Jason Evans/* Generate red-black tree functions. */
5383e5767ee9a8c68150cca06ae0d27a13ba4fcaf8Christopher Ferrisrb_gen(, extent_tree_ad_, extent_tree_t, extent_node_t, ad_link, extent_ad_comp)
54