1b7eaed25SJason Evans #ifndef JEMALLOC_INTERNAL_TYPES_H 2b7eaed25SJason Evans #define JEMALLOC_INTERNAL_TYPES_H 3b7eaed25SJason Evans 4c5ad8142SEric van Gyzen #include "jemalloc/internal/quantum.h" 5c5ad8142SEric van Gyzen 6b7eaed25SJason Evans /* Page size index type. */ 7b7eaed25SJason Evans typedef unsigned pszind_t; 8b7eaed25SJason Evans 9b7eaed25SJason Evans /* Size class index type. */ 10b7eaed25SJason Evans typedef unsigned szind_t; 11b7eaed25SJason Evans 12b7eaed25SJason Evans /* Processor / core id type. */ 13b7eaed25SJason Evans typedef int malloc_cpuid_t; 14b7eaed25SJason Evans 15b7eaed25SJason Evans /* 16b7eaed25SJason Evans * Flags bits: 17b7eaed25SJason Evans * 18b7eaed25SJason Evans * a: arena 19b7eaed25SJason Evans * t: tcache 20b7eaed25SJason Evans * 0: unused 21b7eaed25SJason Evans * z: zero 22b7eaed25SJason Evans * n: alignment 23b7eaed25SJason Evans * 24b7eaed25SJason Evans * aaaaaaaa aaaatttt tttttttt 0znnnnnn 25b7eaed25SJason Evans */ 26b7eaed25SJason Evans #define MALLOCX_ARENA_BITS 12 27b7eaed25SJason Evans #define MALLOCX_TCACHE_BITS 12 28b7eaed25SJason Evans #define MALLOCX_LG_ALIGN_BITS 6 29b7eaed25SJason Evans #define MALLOCX_ARENA_SHIFT 20 30b7eaed25SJason Evans #define MALLOCX_TCACHE_SHIFT 8 31b7eaed25SJason Evans #define MALLOCX_ARENA_MASK \ 32b7eaed25SJason Evans (((1 << MALLOCX_ARENA_BITS) - 1) << MALLOCX_ARENA_SHIFT) 33b7eaed25SJason Evans /* NB: Arena index bias decreases the maximum number of arenas by 1. */ 34b7eaed25SJason Evans #define MALLOCX_ARENA_LIMIT ((1 << MALLOCX_ARENA_BITS) - 1) 35b7eaed25SJason Evans #define MALLOCX_TCACHE_MASK \ 36b7eaed25SJason Evans (((1 << MALLOCX_TCACHE_BITS) - 1) << MALLOCX_TCACHE_SHIFT) 37b7eaed25SJason Evans #define MALLOCX_TCACHE_MAX ((1 << MALLOCX_TCACHE_BITS) - 3) 38b7eaed25SJason Evans #define MALLOCX_LG_ALIGN_MASK ((1 << MALLOCX_LG_ALIGN_BITS) - 1) 39b7eaed25SJason Evans /* Use MALLOCX_ALIGN_GET() if alignment may not be specified in flags. */ 40b7eaed25SJason Evans #define MALLOCX_ALIGN_GET_SPECIFIED(flags) \ 41b7eaed25SJason Evans (ZU(1) << (flags & MALLOCX_LG_ALIGN_MASK)) 42b7eaed25SJason Evans #define MALLOCX_ALIGN_GET(flags) \ 43b7eaed25SJason Evans (MALLOCX_ALIGN_GET_SPECIFIED(flags) & (SIZE_T_MAX-1)) 44b7eaed25SJason Evans #define MALLOCX_ZERO_GET(flags) \ 45b7eaed25SJason Evans ((bool)(flags & MALLOCX_ZERO)) 46b7eaed25SJason Evans 47b7eaed25SJason Evans #define MALLOCX_TCACHE_GET(flags) \ 48b7eaed25SJason Evans (((unsigned)((flags & MALLOCX_TCACHE_MASK) >> MALLOCX_TCACHE_SHIFT)) - 2) 49b7eaed25SJason Evans #define MALLOCX_ARENA_GET(flags) \ 50b7eaed25SJason Evans (((unsigned)(((unsigned)flags) >> MALLOCX_ARENA_SHIFT)) - 1) 51b7eaed25SJason Evans 52b7eaed25SJason Evans /* Smallest size class to support. */ 53b7eaed25SJason Evans #define TINY_MIN (1U << LG_TINY_MIN) 54b7eaed25SJason Evans 55b7eaed25SJason Evans #define LONG ((size_t)(1U << LG_SIZEOF_LONG)) 56b7eaed25SJason Evans #define LONG_MASK (LONG - 1) 57b7eaed25SJason Evans 58b7eaed25SJason Evans /* Return the smallest long multiple that is >= a. */ 59b7eaed25SJason Evans #define LONG_CEILING(a) \ 60b7eaed25SJason Evans (((a) + LONG_MASK) & ~LONG_MASK) 61b7eaed25SJason Evans 62b7eaed25SJason Evans #define SIZEOF_PTR (1U << LG_SIZEOF_PTR) 63b7eaed25SJason Evans #define PTR_MASK (SIZEOF_PTR - 1) 64b7eaed25SJason Evans 65b7eaed25SJason Evans /* Return the smallest (void *) multiple that is >= a. */ 66b7eaed25SJason Evans #define PTR_CEILING(a) \ 67b7eaed25SJason Evans (((a) + PTR_MASK) & ~PTR_MASK) 68b7eaed25SJason Evans 69b7eaed25SJason Evans /* 70b7eaed25SJason Evans * Maximum size of L1 cache line. This is used to avoid cache line aliasing. 71b7eaed25SJason Evans * In addition, this controls the spacing of cacheline-spaced size classes. 72b7eaed25SJason Evans * 73b7eaed25SJason Evans * CACHELINE cannot be based on LG_CACHELINE because __declspec(align()) can 74b7eaed25SJason Evans * only handle raw constants. 75b7eaed25SJason Evans */ 76b7eaed25SJason Evans #define LG_CACHELINE 6 77b7eaed25SJason Evans #define CACHELINE 64 78b7eaed25SJason Evans #define CACHELINE_MASK (CACHELINE - 1) 79b7eaed25SJason Evans 80b7eaed25SJason Evans /* Return the smallest cacheline multiple that is >= s. */ 81b7eaed25SJason Evans #define CACHELINE_CEILING(s) \ 82b7eaed25SJason Evans (((s) + CACHELINE_MASK) & ~CACHELINE_MASK) 83b7eaed25SJason Evans 84b7eaed25SJason Evans /* Return the nearest aligned address at or below a. */ 85b7eaed25SJason Evans #define ALIGNMENT_ADDR2BASE(a, alignment) \ 86b7eaed25SJason Evans ((void *)((uintptr_t)(a) & ((~(alignment)) + 1))) 87b7eaed25SJason Evans 88b7eaed25SJason Evans /* Return the offset between a and the nearest aligned address at or below a. */ 89b7eaed25SJason Evans #define ALIGNMENT_ADDR2OFFSET(a, alignment) \ 90b7eaed25SJason Evans ((size_t)((uintptr_t)(a) & (alignment - 1))) 91b7eaed25SJason Evans 92b7eaed25SJason Evans /* Return the smallest alignment multiple that is >= s. */ 93b7eaed25SJason Evans #define ALIGNMENT_CEILING(s, alignment) \ 94b7eaed25SJason Evans (((s) + (alignment - 1)) & ((~(alignment)) + 1)) 95b7eaed25SJason Evans 96b7eaed25SJason Evans /* Declare a variable-length array. */ 97b7eaed25SJason Evans #if __STDC_VERSION__ < 199901L 98b7eaed25SJason Evans # ifdef _MSC_VER 99b7eaed25SJason Evans # include <malloc.h> 100b7eaed25SJason Evans # define alloca _alloca 101b7eaed25SJason Evans # else 102b7eaed25SJason Evans # ifdef JEMALLOC_HAS_ALLOCA_H 103b7eaed25SJason Evans # include <alloca.h> 104b7eaed25SJason Evans # else 105b7eaed25SJason Evans # include <stdlib.h> 106b7eaed25SJason Evans # endif 107b7eaed25SJason Evans # endif 108b7eaed25SJason Evans # define VARIABLE_ARRAY(type, name, count) \ 109b7eaed25SJason Evans type *name = alloca(sizeof(type) * (count)) 110b7eaed25SJason Evans #else 111b7eaed25SJason Evans # define VARIABLE_ARRAY(type, name, count) type name[(count)] 112b7eaed25SJason Evans #endif 113b7eaed25SJason Evans 114b7eaed25SJason Evans #endif /* JEMALLOC_INTERNAL_TYPES_H */ 115