diff options
author | David Goldblatt <davidgoldblatt@fb.com> | 2017-01-10 18:06:31 -0800 |
---|---|---|
committer | David Goldblatt <davidtgoldblatt@gmail.com> | 2017-01-12 15:43:51 -0800 |
commit | 77cccac8cde9fb1f1555331814c4e6440c16de43 (patch) | |
tree | a8a9c7c88474b892a6d511c3c13073f2c35cdfca /include/jemalloc/internal/extent_inlines.h | |
parent | 94c5d22a4da7844d0bdc5b370e47b1ba14268af2 (diff) | |
download | platform_external_jemalloc_new-77cccac8cde9fb1f1555331814c4e6440c16de43.tar.gz platform_external_jemalloc_new-77cccac8cde9fb1f1555331814c4e6440c16de43.tar.bz2 platform_external_jemalloc_new-77cccac8cde9fb1f1555331814c4e6440c16de43.zip |
Break up headers into constituent parts
This is part of a broader change to make header files better represent the
dependencies between one another (see
https://github.com/jemalloc/jemalloc/issues/533). It breaks up component headers
into smaller parts that can be made to have a simpler dependency graph.
For the autogenerated headers (smoothstep.h and size_classes.h), no splitting
was necessary, so I didn't add support to emit multiple headers.
Diffstat (limited to 'include/jemalloc/internal/extent_inlines.h')
-rw-r--r-- | include/jemalloc/internal/extent_inlines.h | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/include/jemalloc/internal/extent_inlines.h b/include/jemalloc/internal/extent_inlines.h new file mode 100644 index 00000000..e48af92f --- /dev/null +++ b/include/jemalloc/internal/extent_inlines.h @@ -0,0 +1,343 @@ +#ifndef JEMALLOC_INTERNAL_EXTENT_INLINES_H +#define JEMALLOC_INTERNAL_EXTENT_INLINES_H + +#ifndef JEMALLOC_ENABLE_INLINE +extent_t *extent_lookup(tsdn_t *tsdn, const void *ptr, bool dependent); +arena_t *extent_arena_get(const extent_t *extent); +void *extent_base_get(const extent_t *extent); +void *extent_addr_get(const extent_t *extent); +size_t extent_size_get(const extent_t *extent); +size_t extent_usize_get(const extent_t *extent); +void *extent_before_get(const extent_t *extent); +void *extent_last_get(const extent_t *extent); +void *extent_past_get(const extent_t *extent); +size_t extent_sn_get(const extent_t *extent); +bool extent_active_get(const extent_t *extent); +bool extent_retained_get(const extent_t *extent); +bool extent_zeroed_get(const extent_t *extent); +bool extent_committed_get(const extent_t *extent); +bool extent_slab_get(const extent_t *extent); +arena_slab_data_t *extent_slab_data_get(extent_t *extent); +const arena_slab_data_t *extent_slab_data_get_const(const extent_t *extent); +prof_tctx_t *extent_prof_tctx_get(const extent_t *extent); +void extent_arena_set(extent_t *extent, arena_t *arena); +void extent_addr_set(extent_t *extent, void *addr); +void extent_addr_randomize(tsdn_t *tsdn, extent_t *extent, size_t alignment); +void extent_size_set(extent_t *extent, size_t size); +void extent_usize_set(extent_t *extent, size_t usize); +void extent_sn_set(extent_t *extent, size_t sn); +void extent_active_set(extent_t *extent, bool active); +void extent_zeroed_set(extent_t *extent, bool zeroed); +void extent_committed_set(extent_t *extent, bool committed); +void extent_slab_set(extent_t *extent, bool slab); +void extent_prof_tctx_set(extent_t *extent, prof_tctx_t *tctx); +void extent_init(extent_t *extent, arena_t *arena, void *addr, + size_t size, size_t usize, size_t sn, bool active, bool zeroed, + bool committed, bool slab); +void extent_ring_insert(extent_t *sentinel, extent_t *extent); +void extent_ring_remove(extent_t *extent); +int extent_sn_comp(const extent_t *a, const extent_t *b); +int extent_ad_comp(const extent_t *a, const extent_t *b); +int extent_snad_comp(const extent_t *a, const extent_t *b); +#endif + +#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_EXTENT_C_)) +JEMALLOC_INLINE extent_t * +extent_lookup(tsdn_t *tsdn, const void *ptr, bool dependent) +{ + rtree_ctx_t rtree_ctx_fallback; + rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); + + return (rtree_read(tsdn, &extents_rtree, rtree_ctx, (uintptr_t)ptr, + dependent)); +} + +JEMALLOC_INLINE arena_t * +extent_arena_get(const extent_t *extent) +{ + + return (extent->e_arena); +} + +JEMALLOC_INLINE void * +extent_base_get(const extent_t *extent) +{ + + assert(extent->e_addr == PAGE_ADDR2BASE(extent->e_addr) || + !extent->e_slab); + return (PAGE_ADDR2BASE(extent->e_addr)); +} + +JEMALLOC_INLINE void * +extent_addr_get(const extent_t *extent) +{ + + assert(extent->e_addr == PAGE_ADDR2BASE(extent->e_addr) || + !extent->e_slab); + return (extent->e_addr); +} + +JEMALLOC_INLINE size_t +extent_size_get(const extent_t *extent) +{ + + return (extent->e_size); +} + +JEMALLOC_INLINE size_t +extent_usize_get(const extent_t *extent) +{ + + assert(!extent->e_slab); + return (extent->e_usize); +} + +JEMALLOC_INLINE void * +extent_before_get(const extent_t *extent) +{ + + return ((void *)((uintptr_t)extent_base_get(extent) - PAGE)); +} + +JEMALLOC_INLINE void * +extent_last_get(const extent_t *extent) +{ + + return ((void *)((uintptr_t)extent_base_get(extent) + + extent_size_get(extent) - PAGE)); +} + +JEMALLOC_INLINE void * +extent_past_get(const extent_t *extent) +{ + + return ((void *)((uintptr_t)extent_base_get(extent) + + extent_size_get(extent))); +} + +JEMALLOC_INLINE size_t +extent_sn_get(const extent_t *extent) +{ + + return (extent->e_sn); +} + +JEMALLOC_INLINE bool +extent_active_get(const extent_t *extent) +{ + + return (extent->e_active); +} + +JEMALLOC_INLINE bool +extent_retained_get(const extent_t *extent) +{ + + return (qr_next(extent, qr_link) == extent); +} + +JEMALLOC_INLINE bool +extent_zeroed_get(const extent_t *extent) +{ + + return (extent->e_zeroed); +} + +JEMALLOC_INLINE bool +extent_committed_get(const extent_t *extent) +{ + + return (extent->e_committed); +} + +JEMALLOC_INLINE bool +extent_slab_get(const extent_t *extent) +{ + + return (extent->e_slab); +} + +JEMALLOC_INLINE arena_slab_data_t * +extent_slab_data_get(extent_t *extent) +{ + + assert(extent->e_slab); + return (&extent->e_slab_data); +} + +JEMALLOC_INLINE const arena_slab_data_t * +extent_slab_data_get_const(const extent_t *extent) +{ + + assert(extent->e_slab); + return (&extent->e_slab_data); +} + +JEMALLOC_INLINE prof_tctx_t * +extent_prof_tctx_get(const extent_t *extent) +{ + + return ((prof_tctx_t *)atomic_read_p( + &((extent_t *)extent)->e_prof_tctx_pun)); +} + +JEMALLOC_INLINE void +extent_arena_set(extent_t *extent, arena_t *arena) +{ + + extent->e_arena = arena; +} + +JEMALLOC_INLINE void +extent_addr_set(extent_t *extent, void *addr) +{ + + extent->e_addr = addr; +} + +JEMALLOC_INLINE void +extent_addr_randomize(tsdn_t *tsdn, extent_t *extent, size_t alignment) +{ + + assert(extent_base_get(extent) == extent_addr_get(extent)); + + if (alignment < PAGE) { + unsigned lg_range = LG_PAGE - + lg_floor(CACHELINE_CEILING(alignment)); + size_t r = + prng_lg_range_zu(&extent_arena_get(extent)->offset_state, + lg_range, true); + uintptr_t random_offset = ((uintptr_t)r) << (LG_PAGE - + lg_range); + extent->e_addr = (void *)((uintptr_t)extent->e_addr + + random_offset); + assert(ALIGNMENT_ADDR2BASE(extent->e_addr, alignment) == + extent->e_addr); + } +} + +JEMALLOC_INLINE void +extent_size_set(extent_t *extent, size_t size) +{ + + extent->e_size = size; +} + +JEMALLOC_INLINE void +extent_usize_set(extent_t *extent, size_t usize) +{ + + extent->e_usize = usize; +} + +JEMALLOC_INLINE void +extent_sn_set(extent_t *extent, size_t sn) +{ + + extent->e_sn = sn; +} + +JEMALLOC_INLINE void +extent_active_set(extent_t *extent, bool active) +{ + + extent->e_active = active; +} + +JEMALLOC_INLINE void +extent_zeroed_set(extent_t *extent, bool zeroed) +{ + + extent->e_zeroed = zeroed; +} + +JEMALLOC_INLINE void +extent_committed_set(extent_t *extent, bool committed) +{ + + extent->e_committed = committed; +} + +JEMALLOC_INLINE void +extent_slab_set(extent_t *extent, bool slab) +{ + + extent->e_slab = slab; +} + +JEMALLOC_INLINE void +extent_prof_tctx_set(extent_t *extent, prof_tctx_t *tctx) +{ + + atomic_write_p(&extent->e_prof_tctx_pun, tctx); +} + +JEMALLOC_INLINE void +extent_init(extent_t *extent, arena_t *arena, void *addr, size_t size, + size_t usize, size_t sn, bool active, bool zeroed, bool committed, + bool slab) +{ + + assert(addr == PAGE_ADDR2BASE(addr) || !slab); + + extent_arena_set(extent, arena); + extent_addr_set(extent, addr); + extent_size_set(extent, size); + extent_usize_set(extent, usize); + extent_sn_set(extent, sn); + extent_active_set(extent, active); + extent_zeroed_set(extent, zeroed); + extent_committed_set(extent, committed); + extent_slab_set(extent, slab); + if (config_prof) + extent_prof_tctx_set(extent, NULL); + qr_new(extent, qr_link); +} + +JEMALLOC_INLINE void +extent_ring_insert(extent_t *sentinel, extent_t *extent) +{ + + qr_meld(sentinel, extent, extent_t, qr_link); +} + +JEMALLOC_INLINE void +extent_ring_remove(extent_t *extent) +{ + + qr_remove(extent, qr_link); +} + +JEMALLOC_INLINE int +extent_sn_comp(const extent_t *a, const extent_t *b) +{ + size_t a_sn = extent_sn_get(a); + size_t b_sn = extent_sn_get(b); + + return ((a_sn > b_sn) - (a_sn < b_sn)); +} + +JEMALLOC_INLINE int +extent_ad_comp(const extent_t *a, const extent_t *b) +{ + uintptr_t a_addr = (uintptr_t)extent_addr_get(a); + uintptr_t b_addr = (uintptr_t)extent_addr_get(b); + + return ((a_addr > b_addr) - (a_addr < b_addr)); +} + +JEMALLOC_INLINE int +extent_snad_comp(const extent_t *a, const extent_t *b) +{ + int ret; + + ret = extent_sn_comp(a, b); + if (ret != 0) + return (ret); + + ret = extent_ad_comp(a, b); + return (ret); +} +#endif + +#endif /* JEMALLOC_INTERNAL_EXTENT_INLINES_H */ |