xref: /freebsd/contrib/jemalloc/src/extent.c (revision 7fa7f12ff8259b667d0a4d272a575a2d547496d6)
1a4bd5210SJason Evans #define	JEMALLOC_EXTENT_C_
2a4bd5210SJason Evans #include "jemalloc/internal/jemalloc_internal.h"
3a4bd5210SJason Evans 
4a4bd5210SJason Evans /******************************************************************************/
5a4bd5210SJason Evans 
6*7fa7f12fSJason Evans /*
7*7fa7f12fSJason Evans  * Round down to the nearest chunk size that can actually be requested during
8*7fa7f12fSJason Evans  * normal huge allocation.
9*7fa7f12fSJason Evans  */
10d0e79aa3SJason Evans JEMALLOC_INLINE_C size_t
11d0e79aa3SJason Evans extent_quantize(size_t size)
12d0e79aa3SJason Evans {
13*7fa7f12fSJason Evans 	size_t ret;
14*7fa7f12fSJason Evans 	szind_t ind;
15d0e79aa3SJason Evans 
16*7fa7f12fSJason Evans 	assert(size > 0);
17*7fa7f12fSJason Evans 
18*7fa7f12fSJason Evans 	ind = size2index(size + 1);
19*7fa7f12fSJason Evans 	if (ind == 0) {
20*7fa7f12fSJason Evans 		/* Avoid underflow. */
21*7fa7f12fSJason Evans 		return (index2size(0));
22d0e79aa3SJason Evans 	}
23*7fa7f12fSJason Evans 	ret = index2size(ind - 1);
24*7fa7f12fSJason Evans 	assert(ret <= size);
25a4bd5210SJason Evans 	return (ret);
26a4bd5210SJason Evans }
27a4bd5210SJason Evans 
28*7fa7f12fSJason Evans JEMALLOC_INLINE_C int
29*7fa7f12fSJason Evans extent_sz_comp(const extent_node_t *a, const extent_node_t *b)
30*7fa7f12fSJason Evans {
31*7fa7f12fSJason Evans 	size_t a_qsize = extent_quantize(extent_node_size_get(a));
32*7fa7f12fSJason Evans 	size_t b_qsize = extent_quantize(extent_node_size_get(b));
33*7fa7f12fSJason Evans 
34*7fa7f12fSJason Evans 	return ((a_qsize > b_qsize) - (a_qsize < b_qsize));
35*7fa7f12fSJason Evans }
36*7fa7f12fSJason Evans 
37*7fa7f12fSJason Evans JEMALLOC_INLINE_C int
38*7fa7f12fSJason Evans extent_sn_comp(const extent_node_t *a, const extent_node_t *b)
39*7fa7f12fSJason Evans {
40*7fa7f12fSJason Evans 	size_t a_sn = extent_node_sn_get(a);
41*7fa7f12fSJason Evans 	size_t b_sn = extent_node_sn_get(b);
42*7fa7f12fSJason Evans 
43*7fa7f12fSJason Evans 	return ((a_sn > b_sn) - (a_sn < b_sn));
44*7fa7f12fSJason Evans }
45a4bd5210SJason Evans 
46d0e79aa3SJason Evans JEMALLOC_INLINE_C int
47df0d881dSJason Evans extent_ad_comp(const extent_node_t *a, const extent_node_t *b)
48a4bd5210SJason Evans {
49d0e79aa3SJason Evans 	uintptr_t a_addr = (uintptr_t)extent_node_addr_get(a);
50d0e79aa3SJason Evans 	uintptr_t b_addr = (uintptr_t)extent_node_addr_get(b);
51a4bd5210SJason Evans 
52a4bd5210SJason Evans 	return ((a_addr > b_addr) - (a_addr < b_addr));
53a4bd5210SJason Evans }
54a4bd5210SJason Evans 
55*7fa7f12fSJason Evans JEMALLOC_INLINE_C int
56*7fa7f12fSJason Evans extent_szsnad_comp(const extent_node_t *a, const extent_node_t *b)
57*7fa7f12fSJason Evans {
58*7fa7f12fSJason Evans 	int ret;
59*7fa7f12fSJason Evans 
60*7fa7f12fSJason Evans 	ret = extent_sz_comp(a, b);
61*7fa7f12fSJason Evans 	if (ret != 0)
62*7fa7f12fSJason Evans 		return (ret);
63*7fa7f12fSJason Evans 
64*7fa7f12fSJason Evans 	ret = extent_sn_comp(a, b);
65*7fa7f12fSJason Evans 	if (ret != 0)
66*7fa7f12fSJason Evans 		return (ret);
67*7fa7f12fSJason Evans 
68*7fa7f12fSJason Evans 	ret = extent_ad_comp(a, b);
69*7fa7f12fSJason Evans 	return (ret);
70*7fa7f12fSJason Evans }
71*7fa7f12fSJason Evans 
72*7fa7f12fSJason Evans /* Generate red-black tree functions. */
73*7fa7f12fSJason Evans rb_gen(, extent_tree_szsnad_, extent_tree_t, extent_node_t, szsnad_link,
74*7fa7f12fSJason Evans     extent_szsnad_comp)
75*7fa7f12fSJason Evans 
76a4bd5210SJason Evans /* Generate red-black tree functions. */
77d0e79aa3SJason Evans rb_gen(, extent_tree_ad_, extent_tree_t, extent_node_t, ad_link, extent_ad_comp)
78