1*8e33eff8Schristos #ifndef JEMALLOC_INTERNAL_EXTENT_INLINES_H 2*8e33eff8Schristos #define JEMALLOC_INTERNAL_EXTENT_INLINES_H 3*8e33eff8Schristos 4*8e33eff8Schristos #include "jemalloc/internal/mutex.h" 5*8e33eff8Schristos #include "jemalloc/internal/mutex_pool.h" 6*8e33eff8Schristos #include "jemalloc/internal/pages.h" 7*8e33eff8Schristos #include "jemalloc/internal/prng.h" 8*8e33eff8Schristos #include "jemalloc/internal/ql.h" 9*8e33eff8Schristos #include "jemalloc/internal/sz.h" 10*8e33eff8Schristos 11*8e33eff8Schristos static inline void 12*8e33eff8Schristos extent_lock(tsdn_t *tsdn, extent_t *extent) { 13*8e33eff8Schristos assert(extent != NULL); 14*8e33eff8Schristos mutex_pool_lock(tsdn, &extent_mutex_pool, (uintptr_t)extent); 15*8e33eff8Schristos } 16*8e33eff8Schristos 17*8e33eff8Schristos static inline void 18*8e33eff8Schristos extent_unlock(tsdn_t *tsdn, extent_t *extent) { 19*8e33eff8Schristos assert(extent != NULL); 20*8e33eff8Schristos mutex_pool_unlock(tsdn, &extent_mutex_pool, (uintptr_t)extent); 21*8e33eff8Schristos } 22*8e33eff8Schristos 23*8e33eff8Schristos static inline void 24*8e33eff8Schristos extent_lock2(tsdn_t *tsdn, extent_t *extent1, extent_t *extent2) { 25*8e33eff8Schristos assert(extent1 != NULL && extent2 != NULL); 26*8e33eff8Schristos mutex_pool_lock2(tsdn, &extent_mutex_pool, (uintptr_t)extent1, 27*8e33eff8Schristos (uintptr_t)extent2); 28*8e33eff8Schristos } 29*8e33eff8Schristos 30*8e33eff8Schristos static inline void 31*8e33eff8Schristos extent_unlock2(tsdn_t *tsdn, extent_t *extent1, extent_t *extent2) { 32*8e33eff8Schristos assert(extent1 != NULL && extent2 != NULL); 33*8e33eff8Schristos mutex_pool_unlock2(tsdn, &extent_mutex_pool, (uintptr_t)extent1, 34*8e33eff8Schristos (uintptr_t)extent2); 35*8e33eff8Schristos } 36*8e33eff8Schristos 37*8e33eff8Schristos static inline arena_t * 38*8e33eff8Schristos extent_arena_get(const extent_t *extent) { 39*8e33eff8Schristos unsigned arena_ind = (unsigned)((extent->e_bits & 40*8e33eff8Schristos EXTENT_BITS_ARENA_MASK) >> EXTENT_BITS_ARENA_SHIFT); 41*8e33eff8Schristos /* 42*8e33eff8Schristos * The following check is omitted because we should never actually read 43*8e33eff8Schristos * a NULL arena pointer. 44*8e33eff8Schristos */ 45*8e33eff8Schristos if (false && arena_ind >= MALLOCX_ARENA_LIMIT) { 46*8e33eff8Schristos return NULL; 47*8e33eff8Schristos } 48*8e33eff8Schristos assert(arena_ind < MALLOCX_ARENA_LIMIT); 49*8e33eff8Schristos return (arena_t *)atomic_load_p(&arenas[arena_ind], ATOMIC_ACQUIRE); 50*8e33eff8Schristos } 51*8e33eff8Schristos 52*8e33eff8Schristos static inline szind_t 53*8e33eff8Schristos extent_szind_get_maybe_invalid(const extent_t *extent) { 54*8e33eff8Schristos szind_t szind = (szind_t)((extent->e_bits & EXTENT_BITS_SZIND_MASK) >> 55*8e33eff8Schristos EXTENT_BITS_SZIND_SHIFT); 56*8e33eff8Schristos assert(szind <= NSIZES); 57*8e33eff8Schristos return szind; 58*8e33eff8Schristos } 59*8e33eff8Schristos 60*8e33eff8Schristos static inline szind_t 61*8e33eff8Schristos extent_szind_get(const extent_t *extent) { 62*8e33eff8Schristos szind_t szind = extent_szind_get_maybe_invalid(extent); 63*8e33eff8Schristos assert(szind < NSIZES); /* Never call when "invalid". */ 64*8e33eff8Schristos return szind; 65*8e33eff8Schristos } 66*8e33eff8Schristos 67*8e33eff8Schristos static inline size_t 68*8e33eff8Schristos extent_usize_get(const extent_t *extent) { 69*8e33eff8Schristos return sz_index2size(extent_szind_get(extent)); 70*8e33eff8Schristos } 71*8e33eff8Schristos 72*8e33eff8Schristos static inline size_t 73*8e33eff8Schristos extent_sn_get(const extent_t *extent) { 74*8e33eff8Schristos return (size_t)((extent->e_bits & EXTENT_BITS_SN_MASK) >> 75*8e33eff8Schristos EXTENT_BITS_SN_SHIFT); 76*8e33eff8Schristos } 77*8e33eff8Schristos 78*8e33eff8Schristos static inline extent_state_t 79*8e33eff8Schristos extent_state_get(const extent_t *extent) { 80*8e33eff8Schristos return (extent_state_t)((extent->e_bits & EXTENT_BITS_STATE_MASK) >> 81*8e33eff8Schristos EXTENT_BITS_STATE_SHIFT); 82*8e33eff8Schristos } 83*8e33eff8Schristos 84*8e33eff8Schristos static inline bool 85*8e33eff8Schristos extent_zeroed_get(const extent_t *extent) { 86*8e33eff8Schristos return (bool)((extent->e_bits & EXTENT_BITS_ZEROED_MASK) >> 87*8e33eff8Schristos EXTENT_BITS_ZEROED_SHIFT); 88*8e33eff8Schristos } 89*8e33eff8Schristos 90*8e33eff8Schristos static inline bool 91*8e33eff8Schristos extent_committed_get(const extent_t *extent) { 92*8e33eff8Schristos return (bool)((extent->e_bits & EXTENT_BITS_COMMITTED_MASK) >> 93*8e33eff8Schristos EXTENT_BITS_COMMITTED_SHIFT); 94*8e33eff8Schristos } 95*8e33eff8Schristos 96*8e33eff8Schristos static inline bool 97*8e33eff8Schristos extent_dumpable_get(const extent_t *extent) { 98*8e33eff8Schristos return (bool)((extent->e_bits & EXTENT_BITS_DUMPABLE_MASK) >> 99*8e33eff8Schristos EXTENT_BITS_DUMPABLE_SHIFT); 100*8e33eff8Schristos } 101*8e33eff8Schristos 102*8e33eff8Schristos static inline bool 103*8e33eff8Schristos extent_slab_get(const extent_t *extent) { 104*8e33eff8Schristos return (bool)((extent->e_bits & EXTENT_BITS_SLAB_MASK) >> 105*8e33eff8Schristos EXTENT_BITS_SLAB_SHIFT); 106*8e33eff8Schristos } 107*8e33eff8Schristos 108*8e33eff8Schristos static inline unsigned 109*8e33eff8Schristos extent_nfree_get(const extent_t *extent) { 110*8e33eff8Schristos assert(extent_slab_get(extent)); 111*8e33eff8Schristos return (unsigned)((extent->e_bits & EXTENT_BITS_NFREE_MASK) >> 112*8e33eff8Schristos EXTENT_BITS_NFREE_SHIFT); 113*8e33eff8Schristos } 114*8e33eff8Schristos 115*8e33eff8Schristos static inline void * 116*8e33eff8Schristos extent_base_get(const extent_t *extent) { 117*8e33eff8Schristos assert(extent->e_addr == PAGE_ADDR2BASE(extent->e_addr) || 118*8e33eff8Schristos !extent_slab_get(extent)); 119*8e33eff8Schristos return PAGE_ADDR2BASE(extent->e_addr); 120*8e33eff8Schristos } 121*8e33eff8Schristos 122*8e33eff8Schristos static inline void * 123*8e33eff8Schristos extent_addr_get(const extent_t *extent) { 124*8e33eff8Schristos assert(extent->e_addr == PAGE_ADDR2BASE(extent->e_addr) || 125*8e33eff8Schristos !extent_slab_get(extent)); 126*8e33eff8Schristos return extent->e_addr; 127*8e33eff8Schristos } 128*8e33eff8Schristos 129*8e33eff8Schristos static inline size_t 130*8e33eff8Schristos extent_size_get(const extent_t *extent) { 131*8e33eff8Schristos return (extent->e_size_esn & EXTENT_SIZE_MASK); 132*8e33eff8Schristos } 133*8e33eff8Schristos 134*8e33eff8Schristos static inline size_t 135*8e33eff8Schristos extent_esn_get(const extent_t *extent) { 136*8e33eff8Schristos return (extent->e_size_esn & EXTENT_ESN_MASK); 137*8e33eff8Schristos } 138*8e33eff8Schristos 139*8e33eff8Schristos static inline size_t 140*8e33eff8Schristos extent_bsize_get(const extent_t *extent) { 141*8e33eff8Schristos return extent->e_bsize; 142*8e33eff8Schristos } 143*8e33eff8Schristos 144*8e33eff8Schristos static inline void * 145*8e33eff8Schristos extent_before_get(const extent_t *extent) { 146*8e33eff8Schristos return (void *)((uintptr_t)extent_base_get(extent) - PAGE); 147*8e33eff8Schristos } 148*8e33eff8Schristos 149*8e33eff8Schristos static inline void * 150*8e33eff8Schristos extent_last_get(const extent_t *extent) { 151*8e33eff8Schristos return (void *)((uintptr_t)extent_base_get(extent) + 152*8e33eff8Schristos extent_size_get(extent) - PAGE); 153*8e33eff8Schristos } 154*8e33eff8Schristos 155*8e33eff8Schristos static inline void * 156*8e33eff8Schristos extent_past_get(const extent_t *extent) { 157*8e33eff8Schristos return (void *)((uintptr_t)extent_base_get(extent) + 158*8e33eff8Schristos extent_size_get(extent)); 159*8e33eff8Schristos } 160*8e33eff8Schristos 161*8e33eff8Schristos static inline arena_slab_data_t * 162*8e33eff8Schristos extent_slab_data_get(extent_t *extent) { 163*8e33eff8Schristos assert(extent_slab_get(extent)); 164*8e33eff8Schristos return &extent->e_slab_data; 165*8e33eff8Schristos } 166*8e33eff8Schristos 167*8e33eff8Schristos static inline const arena_slab_data_t * 168*8e33eff8Schristos extent_slab_data_get_const(const extent_t *extent) { 169*8e33eff8Schristos assert(extent_slab_get(extent)); 170*8e33eff8Schristos return &extent->e_slab_data; 171*8e33eff8Schristos } 172*8e33eff8Schristos 173*8e33eff8Schristos static inline prof_tctx_t * 174*8e33eff8Schristos extent_prof_tctx_get(const extent_t *extent) { 175*8e33eff8Schristos return (prof_tctx_t *)atomic_load_p(&extent->e_prof_tctx, 176*8e33eff8Schristos ATOMIC_ACQUIRE); 177*8e33eff8Schristos } 178*8e33eff8Schristos 179*8e33eff8Schristos static inline void 180*8e33eff8Schristos extent_arena_set(extent_t *extent, arena_t *arena) { 181*8e33eff8Schristos unsigned arena_ind = (arena != NULL) ? arena_ind_get(arena) : ((1U << 182*8e33eff8Schristos MALLOCX_ARENA_BITS) - 1); 183*8e33eff8Schristos extent->e_bits = (extent->e_bits & ~EXTENT_BITS_ARENA_MASK) | 184*8e33eff8Schristos ((uint64_t)arena_ind << EXTENT_BITS_ARENA_SHIFT); 185*8e33eff8Schristos } 186*8e33eff8Schristos 187*8e33eff8Schristos static inline void 188*8e33eff8Schristos extent_addr_set(extent_t *extent, void *addr) { 189*8e33eff8Schristos extent->e_addr = addr; 190*8e33eff8Schristos } 191*8e33eff8Schristos 192*8e33eff8Schristos static inline void 193*8e33eff8Schristos extent_addr_randomize(UNUSED tsdn_t *tsdn, extent_t *extent, size_t alignment) { 194*8e33eff8Schristos assert(extent_base_get(extent) == extent_addr_get(extent)); 195*8e33eff8Schristos 196*8e33eff8Schristos if (alignment < PAGE) { 197*8e33eff8Schristos unsigned lg_range = LG_PAGE - 198*8e33eff8Schristos lg_floor(CACHELINE_CEILING(alignment)); 199*8e33eff8Schristos size_t r; 200*8e33eff8Schristos if (!tsdn_null(tsdn)) { 201*8e33eff8Schristos tsd_t *tsd = tsdn_tsd(tsdn); 202*8e33eff8Schristos r = (size_t)prng_lg_range_u64( 203*8e33eff8Schristos tsd_offset_statep_get(tsd), lg_range); 204*8e33eff8Schristos } else { 205*8e33eff8Schristos r = prng_lg_range_zu( 206*8e33eff8Schristos &extent_arena_get(extent)->offset_state, 207*8e33eff8Schristos lg_range, true); 208*8e33eff8Schristos } 209*8e33eff8Schristos uintptr_t random_offset = ((uintptr_t)r) << (LG_PAGE - 210*8e33eff8Schristos lg_range); 211*8e33eff8Schristos extent->e_addr = (void *)((uintptr_t)extent->e_addr + 212*8e33eff8Schristos random_offset); 213*8e33eff8Schristos assert(ALIGNMENT_ADDR2BASE(extent->e_addr, alignment) == 214*8e33eff8Schristos extent->e_addr); 215*8e33eff8Schristos } 216*8e33eff8Schristos } 217*8e33eff8Schristos 218*8e33eff8Schristos static inline void 219*8e33eff8Schristos extent_size_set(extent_t *extent, size_t size) { 220*8e33eff8Schristos assert((size & ~EXTENT_SIZE_MASK) == 0); 221*8e33eff8Schristos extent->e_size_esn = size | (extent->e_size_esn & ~EXTENT_SIZE_MASK); 222*8e33eff8Schristos } 223*8e33eff8Schristos 224*8e33eff8Schristos static inline void 225*8e33eff8Schristos extent_esn_set(extent_t *extent, size_t esn) { 226*8e33eff8Schristos extent->e_size_esn = (extent->e_size_esn & ~EXTENT_ESN_MASK) | (esn & 227*8e33eff8Schristos EXTENT_ESN_MASK); 228*8e33eff8Schristos } 229*8e33eff8Schristos 230*8e33eff8Schristos static inline void 231*8e33eff8Schristos extent_bsize_set(extent_t *extent, size_t bsize) { 232*8e33eff8Schristos extent->e_bsize = bsize; 233*8e33eff8Schristos } 234*8e33eff8Schristos 235*8e33eff8Schristos static inline void 236*8e33eff8Schristos extent_szind_set(extent_t *extent, szind_t szind) { 237*8e33eff8Schristos assert(szind <= NSIZES); /* NSIZES means "invalid". */ 238*8e33eff8Schristos extent->e_bits = (extent->e_bits & ~EXTENT_BITS_SZIND_MASK) | 239*8e33eff8Schristos ((uint64_t)szind << EXTENT_BITS_SZIND_SHIFT); 240*8e33eff8Schristos } 241*8e33eff8Schristos 242*8e33eff8Schristos static inline void 243*8e33eff8Schristos extent_nfree_set(extent_t *extent, unsigned nfree) { 244*8e33eff8Schristos assert(extent_slab_get(extent)); 245*8e33eff8Schristos extent->e_bits = (extent->e_bits & ~EXTENT_BITS_NFREE_MASK) | 246*8e33eff8Schristos ((uint64_t)nfree << EXTENT_BITS_NFREE_SHIFT); 247*8e33eff8Schristos } 248*8e33eff8Schristos 249*8e33eff8Schristos static inline void 250*8e33eff8Schristos extent_nfree_inc(extent_t *extent) { 251*8e33eff8Schristos assert(extent_slab_get(extent)); 252*8e33eff8Schristos extent->e_bits += ((uint64_t)1U << EXTENT_BITS_NFREE_SHIFT); 253*8e33eff8Schristos } 254*8e33eff8Schristos 255*8e33eff8Schristos static inline void 256*8e33eff8Schristos extent_nfree_dec(extent_t *extent) { 257*8e33eff8Schristos assert(extent_slab_get(extent)); 258*8e33eff8Schristos extent->e_bits -= ((uint64_t)1U << EXTENT_BITS_NFREE_SHIFT); 259*8e33eff8Schristos } 260*8e33eff8Schristos 261*8e33eff8Schristos static inline void 262*8e33eff8Schristos extent_sn_set(extent_t *extent, size_t sn) { 263*8e33eff8Schristos extent->e_bits = (extent->e_bits & ~EXTENT_BITS_SN_MASK) | 264*8e33eff8Schristos ((uint64_t)sn << EXTENT_BITS_SN_SHIFT); 265*8e33eff8Schristos } 266*8e33eff8Schristos 267*8e33eff8Schristos static inline void 268*8e33eff8Schristos extent_state_set(extent_t *extent, extent_state_t state) { 269*8e33eff8Schristos extent->e_bits = (extent->e_bits & ~EXTENT_BITS_STATE_MASK) | 270*8e33eff8Schristos ((uint64_t)state << EXTENT_BITS_STATE_SHIFT); 271*8e33eff8Schristos } 272*8e33eff8Schristos 273*8e33eff8Schristos static inline void 274*8e33eff8Schristos extent_zeroed_set(extent_t *extent, bool zeroed) { 275*8e33eff8Schristos extent->e_bits = (extent->e_bits & ~EXTENT_BITS_ZEROED_MASK) | 276*8e33eff8Schristos ((uint64_t)zeroed << EXTENT_BITS_ZEROED_SHIFT); 277*8e33eff8Schristos } 278*8e33eff8Schristos 279*8e33eff8Schristos static inline void 280*8e33eff8Schristos extent_committed_set(extent_t *extent, bool committed) { 281*8e33eff8Schristos extent->e_bits = (extent->e_bits & ~EXTENT_BITS_COMMITTED_MASK) | 282*8e33eff8Schristos ((uint64_t)committed << EXTENT_BITS_COMMITTED_SHIFT); 283*8e33eff8Schristos } 284*8e33eff8Schristos 285*8e33eff8Schristos static inline void 286*8e33eff8Schristos extent_dumpable_set(extent_t *extent, bool dumpable) { 287*8e33eff8Schristos extent->e_bits = (extent->e_bits & ~EXTENT_BITS_DUMPABLE_MASK) | 288*8e33eff8Schristos ((uint64_t)dumpable << EXTENT_BITS_DUMPABLE_SHIFT); 289*8e33eff8Schristos } 290*8e33eff8Schristos 291*8e33eff8Schristos static inline void 292*8e33eff8Schristos extent_slab_set(extent_t *extent, bool slab) { 293*8e33eff8Schristos extent->e_bits = (extent->e_bits & ~EXTENT_BITS_SLAB_MASK) | 294*8e33eff8Schristos ((uint64_t)slab << EXTENT_BITS_SLAB_SHIFT); 295*8e33eff8Schristos } 296*8e33eff8Schristos 297*8e33eff8Schristos static inline void 298*8e33eff8Schristos extent_prof_tctx_set(extent_t *extent, prof_tctx_t *tctx) { 299*8e33eff8Schristos atomic_store_p(&extent->e_prof_tctx, tctx, ATOMIC_RELEASE); 300*8e33eff8Schristos } 301*8e33eff8Schristos 302*8e33eff8Schristos static inline void 303*8e33eff8Schristos extent_init(extent_t *extent, arena_t *arena, void *addr, size_t size, 304*8e33eff8Schristos bool slab, szind_t szind, size_t sn, extent_state_t state, bool zeroed, 305*8e33eff8Schristos bool committed, bool dumpable) { 306*8e33eff8Schristos assert(addr == PAGE_ADDR2BASE(addr) || !slab); 307*8e33eff8Schristos 308*8e33eff8Schristos extent_arena_set(extent, arena); 309*8e33eff8Schristos extent_addr_set(extent, addr); 310*8e33eff8Schristos extent_size_set(extent, size); 311*8e33eff8Schristos extent_slab_set(extent, slab); 312*8e33eff8Schristos extent_szind_set(extent, szind); 313*8e33eff8Schristos extent_sn_set(extent, sn); 314*8e33eff8Schristos extent_state_set(extent, state); 315*8e33eff8Schristos extent_zeroed_set(extent, zeroed); 316*8e33eff8Schristos extent_committed_set(extent, committed); 317*8e33eff8Schristos extent_dumpable_set(extent, dumpable); 318*8e33eff8Schristos ql_elm_new(extent, ql_link); 319*8e33eff8Schristos if (config_prof) { 320*8e33eff8Schristos extent_prof_tctx_set(extent, NULL); 321*8e33eff8Schristos } 322*8e33eff8Schristos } 323*8e33eff8Schristos 324*8e33eff8Schristos static inline void 325*8e33eff8Schristos extent_binit(extent_t *extent, void *addr, size_t bsize, size_t sn) { 326*8e33eff8Schristos extent_arena_set(extent, NULL); 327*8e33eff8Schristos extent_addr_set(extent, addr); 328*8e33eff8Schristos extent_bsize_set(extent, bsize); 329*8e33eff8Schristos extent_slab_set(extent, false); 330*8e33eff8Schristos extent_szind_set(extent, NSIZES); 331*8e33eff8Schristos extent_sn_set(extent, sn); 332*8e33eff8Schristos extent_state_set(extent, extent_state_active); 333*8e33eff8Schristos extent_zeroed_set(extent, true); 334*8e33eff8Schristos extent_committed_set(extent, true); 335*8e33eff8Schristos extent_dumpable_set(extent, true); 336*8e33eff8Schristos } 337*8e33eff8Schristos 338*8e33eff8Schristos static inline void 339*8e33eff8Schristos extent_list_init(extent_list_t *list) { 340*8e33eff8Schristos ql_new(list); 341*8e33eff8Schristos } 342*8e33eff8Schristos 343*8e33eff8Schristos static inline extent_t * 344*8e33eff8Schristos extent_list_first(const extent_list_t *list) { 345*8e33eff8Schristos return ql_first(list); 346*8e33eff8Schristos } 347*8e33eff8Schristos 348*8e33eff8Schristos static inline extent_t * 349*8e33eff8Schristos extent_list_last(const extent_list_t *list) { 350*8e33eff8Schristos return ql_last(list, ql_link); 351*8e33eff8Schristos } 352*8e33eff8Schristos 353*8e33eff8Schristos static inline void 354*8e33eff8Schristos extent_list_append(extent_list_t *list, extent_t *extent) { 355*8e33eff8Schristos ql_tail_insert(list, extent, ql_link); 356*8e33eff8Schristos } 357*8e33eff8Schristos 358*8e33eff8Schristos static inline void 359*8e33eff8Schristos extent_list_prepend(extent_list_t *list, extent_t *extent) { 360*8e33eff8Schristos ql_head_insert(list, extent, ql_link); 361*8e33eff8Schristos } 362*8e33eff8Schristos 363*8e33eff8Schristos static inline void 364*8e33eff8Schristos extent_list_replace(extent_list_t *list, extent_t *to_remove, 365*8e33eff8Schristos extent_t *to_insert) { 366*8e33eff8Schristos ql_after_insert(to_remove, to_insert, ql_link); 367*8e33eff8Schristos ql_remove(list, to_remove, ql_link); 368*8e33eff8Schristos } 369*8e33eff8Schristos 370*8e33eff8Schristos static inline void 371*8e33eff8Schristos extent_list_remove(extent_list_t *list, extent_t *extent) { 372*8e33eff8Schristos ql_remove(list, extent, ql_link); 373*8e33eff8Schristos } 374*8e33eff8Schristos 375*8e33eff8Schristos static inline int 376*8e33eff8Schristos extent_sn_comp(const extent_t *a, const extent_t *b) { 377*8e33eff8Schristos size_t a_sn = extent_sn_get(a); 378*8e33eff8Schristos size_t b_sn = extent_sn_get(b); 379*8e33eff8Schristos 380*8e33eff8Schristos return (a_sn > b_sn) - (a_sn < b_sn); 381*8e33eff8Schristos } 382*8e33eff8Schristos 383*8e33eff8Schristos static inline int 384*8e33eff8Schristos extent_esn_comp(const extent_t *a, const extent_t *b) { 385*8e33eff8Schristos size_t a_esn = extent_esn_get(a); 386*8e33eff8Schristos size_t b_esn = extent_esn_get(b); 387*8e33eff8Schristos 388*8e33eff8Schristos return (a_esn > b_esn) - (a_esn < b_esn); 389*8e33eff8Schristos } 390*8e33eff8Schristos 391*8e33eff8Schristos static inline int 392*8e33eff8Schristos extent_ad_comp(const extent_t *a, const extent_t *b) { 393*8e33eff8Schristos uintptr_t a_addr = (uintptr_t)extent_addr_get(a); 394*8e33eff8Schristos uintptr_t b_addr = (uintptr_t)extent_addr_get(b); 395*8e33eff8Schristos 396*8e33eff8Schristos return (a_addr > b_addr) - (a_addr < b_addr); 397*8e33eff8Schristos } 398*8e33eff8Schristos 399*8e33eff8Schristos static inline int 400*8e33eff8Schristos extent_ead_comp(const extent_t *a, const extent_t *b) { 401*8e33eff8Schristos uintptr_t a_eaddr = (uintptr_t)a; 402*8e33eff8Schristos uintptr_t b_eaddr = (uintptr_t)b; 403*8e33eff8Schristos 404*8e33eff8Schristos return (a_eaddr > b_eaddr) - (a_eaddr < b_eaddr); 405*8e33eff8Schristos } 406*8e33eff8Schristos 407*8e33eff8Schristos static inline int 408*8e33eff8Schristos extent_snad_comp(const extent_t *a, const extent_t *b) { 409*8e33eff8Schristos int ret; 410*8e33eff8Schristos 411*8e33eff8Schristos ret = extent_sn_comp(a, b); 412*8e33eff8Schristos if (ret != 0) { 413*8e33eff8Schristos return ret; 414*8e33eff8Schristos } 415*8e33eff8Schristos 416*8e33eff8Schristos ret = extent_ad_comp(a, b); 417*8e33eff8Schristos return ret; 418*8e33eff8Schristos } 419*8e33eff8Schristos 420*8e33eff8Schristos static inline int 421*8e33eff8Schristos extent_esnead_comp(const extent_t *a, const extent_t *b) { 422*8e33eff8Schristos int ret; 423*8e33eff8Schristos 424*8e33eff8Schristos ret = extent_esn_comp(a, b); 425*8e33eff8Schristos if (ret != 0) { 426*8e33eff8Schristos return ret; 427*8e33eff8Schristos } 428*8e33eff8Schristos 429*8e33eff8Schristos ret = extent_ead_comp(a, b); 430*8e33eff8Schristos return ret; 431*8e33eff8Schristos } 432*8e33eff8Schristos 433*8e33eff8Schristos #endif /* JEMALLOC_INTERNAL_EXTENT_INLINES_H */ 434