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