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