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