xref: /freebsd/contrib/jemalloc/src/extent.c (revision d0e79aa362ed3a077477d26af7a40f64f4516e90)
1a4bd5210SJason Evans #define	JEMALLOC_EXTENT_C_
2a4bd5210SJason Evans #include "jemalloc/internal/jemalloc_internal.h"
3a4bd5210SJason Evans 
4a4bd5210SJason Evans /******************************************************************************/
5a4bd5210SJason Evans 
6*d0e79aa3SJason Evans JEMALLOC_INLINE_C size_t
7*d0e79aa3SJason Evans extent_quantize(size_t size)
8*d0e79aa3SJason Evans {
9*d0e79aa3SJason Evans 
10*d0e79aa3SJason Evans 	/*
11*d0e79aa3SJason Evans 	 * Round down to the nearest chunk size that can actually be requested
12*d0e79aa3SJason Evans 	 * during normal huge allocation.
13*d0e79aa3SJason Evans 	 */
14*d0e79aa3SJason Evans 	return (index2size(size2index(size + 1) - 1));
15*d0e79aa3SJason Evans }
16*d0e79aa3SJason Evans 
17*d0e79aa3SJason Evans JEMALLOC_INLINE_C int
18a4bd5210SJason Evans extent_szad_comp(extent_node_t *a, extent_node_t *b)
19a4bd5210SJason Evans {
20a4bd5210SJason Evans 	int ret;
21*d0e79aa3SJason Evans 	size_t a_qsize = extent_quantize(extent_node_size_get(a));
22*d0e79aa3SJason Evans 	size_t b_qsize = extent_quantize(extent_node_size_get(b));
23a4bd5210SJason Evans 
24*d0e79aa3SJason Evans 	/*
25*d0e79aa3SJason Evans 	 * Compare based on quantized size rather than size, in order to sort
26*d0e79aa3SJason Evans 	 * equally useful extents only by address.
27*d0e79aa3SJason Evans 	 */
28*d0e79aa3SJason Evans 	ret = (a_qsize > b_qsize) - (a_qsize < b_qsize);
29a4bd5210SJason Evans 	if (ret == 0) {
30*d0e79aa3SJason Evans 		uintptr_t a_addr = (uintptr_t)extent_node_addr_get(a);
31*d0e79aa3SJason Evans 		uintptr_t b_addr = (uintptr_t)extent_node_addr_get(b);
32a4bd5210SJason Evans 
33a4bd5210SJason Evans 		ret = (a_addr > b_addr) - (a_addr < b_addr);
34a4bd5210SJason Evans 	}
35a4bd5210SJason Evans 
36a4bd5210SJason Evans 	return (ret);
37a4bd5210SJason Evans }
38a4bd5210SJason Evans 
39a4bd5210SJason Evans /* Generate red-black tree functions. */
40*d0e79aa3SJason Evans rb_gen(, extent_tree_szad_, extent_tree_t, extent_node_t, szad_link,
41a4bd5210SJason Evans     extent_szad_comp)
42a4bd5210SJason Evans 
43*d0e79aa3SJason Evans JEMALLOC_INLINE_C int
44a4bd5210SJason Evans extent_ad_comp(extent_node_t *a, extent_node_t *b)
45a4bd5210SJason Evans {
46*d0e79aa3SJason Evans 	uintptr_t a_addr = (uintptr_t)extent_node_addr_get(a);
47*d0e79aa3SJason Evans 	uintptr_t b_addr = (uintptr_t)extent_node_addr_get(b);
48a4bd5210SJason Evans 
49a4bd5210SJason Evans 	return ((a_addr > b_addr) - (a_addr < b_addr));
50a4bd5210SJason Evans }
51a4bd5210SJason Evans 
52a4bd5210SJason Evans /* Generate red-black tree functions. */
53*d0e79aa3SJason Evans rb_gen(, extent_tree_ad_, extent_tree_t, extent_node_t, ad_link, extent_ad_comp)
54