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