| #ifndef JEMALLOC_INTERNAL_EXTENT_STRUCTS_H |
| #define JEMALLOC_INTERNAL_EXTENT_STRUCTS_H |
| |
| /* Extent (span of pages). Use accessor functions for e_* fields. */ |
| struct extent_s { |
| /* Arena from which this extent came, if any. */ |
| arena_t *e_arena; |
| |
| /* Pointer to the extent that this structure is responsible for. */ |
| void *e_addr; |
| |
| /* Extent size. */ |
| size_t e_size; |
| |
| /* |
| * Usable size, typically smaller than extent size due to large_pad or |
| * promotion of sampled small regions. |
| */ |
| size_t e_usize; |
| |
| /* |
| * Serial number (potentially non-unique). |
| * |
| * In principle serial numbers can wrap around on 32-bit systems if |
| * JEMALLOC_MUNMAP is defined, but as long as comparison functions fall |
| * back on address comparison for equal serial numbers, stable (if |
| * imperfect) ordering is maintained. |
| * |
| * Serial numbers may not be unique even in the absence of wrap-around, |
| * e.g. when splitting an extent and assigning the same serial number to |
| * both resulting adjacent extents. |
| */ |
| size_t e_sn; |
| |
| /* True if extent is active (in use). */ |
| bool e_active; |
| |
| /* |
| * The zeroed flag is used by extent recycling code to track whether |
| * memory is zero-filled. |
| */ |
| bool e_zeroed; |
| |
| /* |
| * True if physical memory is committed to the extent, whether |
| * explicitly or implicitly as on a system that overcommits and |
| * satisfies physical memory needs on demand via soft page faults. |
| */ |
| bool e_committed; |
| |
| /* |
| * The slab flag indicates whether the extent is used for a slab of |
| * small regions. This helps differentiate small size classes, and it |
| * indicates whether interior pointers can be looked up via iealloc(). |
| */ |
| bool e_slab; |
| |
| union { |
| /* Small region slab metadata. */ |
| arena_slab_data_t e_slab_data; |
| |
| /* Profile counters, used for large objects. */ |
| union { |
| void *e_prof_tctx_pun; |
| prof_tctx_t *e_prof_tctx; |
| }; |
| }; |
| |
| /* |
| * Linkage for arena's extents_dirty and arena_bin_t's slabs_full rings. |
| */ |
| qr(extent_t) qr_link; |
| |
| union { |
| /* Linkage for per size class sn/address-ordered heaps. */ |
| phn(extent_t) ph_link; |
| |
| /* Linkage for arena's large and extent_cache lists. */ |
| ql_elm(extent_t) ql_link; |
| }; |
| }; |
| typedef ph(extent_t) extent_heap_t; |
| |
| #endif /* JEMALLOC_INTERNAL_EXTENT_STRUCTS_H */ |