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 | |