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. */
7typedef int malloc_cpuid_t;
8
9/* When realloc(non-null-ptr, 0) is called, what happens? */
10enum 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};
18typedef enum zero_realloc_action_e zero_realloc_action_t;
19
20/* Signature of write callback. */
21typedef void (write_cb_t)(void *, const char *);
22
23enum 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};
29typedef 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