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