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