Home | History | Annotate | Download | only in internal
      1 #ifndef JEMALLOC_INTERNAL_TYPES_H
      2 #define JEMALLOC_INTERNAL_TYPES_H
      3 
      4 /* Page size index type. */
      5 typedef unsigned pszind_t;
      6 
      7 /* Size class index type. */
      8 typedef unsigned szind_t;
      9 
     10 /* Processor / core id type. */
     11 typedef int malloc_cpuid_t;
     12 
     13 /*
     14  * Flags bits:
     15  *
     16  * a: arena
     17  * t: tcache
     18  * 0: unused
     19  * z: zero
     20  * n: alignment
     21  *
     22  * aaaaaaaa aaaatttt tttttttt 0znnnnnn
     23  */
     24 #define MALLOCX_ARENA_BITS	12
     25 #define MALLOCX_TCACHE_BITS	12
     26 #define MALLOCX_LG_ALIGN_BITS	6
     27 #define MALLOCX_ARENA_SHIFT	20
     28 #define MALLOCX_TCACHE_SHIFT	8
     29 #define MALLOCX_ARENA_MASK \
     30     (((1 << MALLOCX_ARENA_BITS) - 1) << MALLOCX_ARENA_SHIFT)
     31 /* NB: Arena index bias decreases the maximum number of arenas by 1. */
     32 #define MALLOCX_ARENA_LIMIT	((1 << MALLOCX_ARENA_BITS) - 1)
     33 #define MALLOCX_TCACHE_MASK \
     34     (((1 << MALLOCX_TCACHE_BITS) - 1) << MALLOCX_TCACHE_SHIFT)
     35 #define MALLOCX_TCACHE_MAX	((1 << MALLOCX_TCACHE_BITS) - 3)
     36 #define MALLOCX_LG_ALIGN_MASK	((1 << MALLOCX_LG_ALIGN_BITS) - 1)
     37 /* Use MALLOCX_ALIGN_GET() if alignment may not be specified in flags. */
     38 #define MALLOCX_ALIGN_GET_SPECIFIED(flags)				\
     39     (ZU(1) << (flags & MALLOCX_LG_ALIGN_MASK))
     40 #define MALLOCX_ALIGN_GET(flags)					\
     41     (MALLOCX_ALIGN_GET_SPECIFIED(flags) & (SIZE_T_MAX-1))
     42 #define MALLOCX_ZERO_GET(flags)						\
     43     ((bool)(flags & MALLOCX_ZERO))
     44 
     45 #define MALLOCX_TCACHE_GET(flags)					\
     46     (((unsigned)((flags & MALLOCX_TCACHE_MASK) >> MALLOCX_TCACHE_SHIFT)) - 2)
     47 #define MALLOCX_ARENA_GET(flags)					\
     48     (((unsigned)(((unsigned)flags) >> MALLOCX_ARENA_SHIFT)) - 1)
     49 
     50 /* Smallest size class to support. */
     51 #define TINY_MIN		(1U << LG_TINY_MIN)
     52 
     53 /*
     54  * Minimum allocation alignment is 2^LG_QUANTUM bytes (ignoring tiny size
     55  * classes).
     56  */
     57 #ifndef LG_QUANTUM
     58 #  if (defined(__i386__) || defined(_M_IX86))
     59 #    define LG_QUANTUM		4
     60 #  endif
     61 #  ifdef __ia64__
     62 #    define LG_QUANTUM		4
     63 #  endif
     64 #  ifdef __alpha__
     65 #    define LG_QUANTUM		4
     66 #  endif
     67 #  if (defined(__sparc64__) || defined(__sparcv9) || defined(__sparc_v9__))
     68 #    define LG_QUANTUM		4
     69 #  endif
     70 #  if (defined(__amd64__) || defined(__x86_64__) || defined(_M_X64))
     71 #    define LG_QUANTUM		4
     72 #  endif
     73 #  ifdef __arm__
     74 #    define LG_QUANTUM		3
     75 #  endif
     76 #  ifdef __aarch64__
     77 #    define LG_QUANTUM		4
     78 #  endif
     79 #  ifdef __hppa__
     80 #    define LG_QUANTUM		4
     81 #  endif
     82 #  ifdef __m68k__
     83 #    define LG_QUANTUM		3
     84 #  endif
     85 #  ifdef __mips__
     86 #    define LG_QUANTUM		3
     87 #  endif
     88 #  ifdef __nios2__
     89 #    define LG_QUANTUM		3
     90 #  endif
     91 #  ifdef __or1k__
     92 #    define LG_QUANTUM		3
     93 #  endif
     94 #  ifdef __powerpc__
     95 #    define LG_QUANTUM		4
     96 #  endif
     97 #  if defined(__riscv) || defined(__riscv__)
     98 #    define LG_QUANTUM		4
     99 #  endif
    100 #  ifdef __s390__
    101 #    define LG_QUANTUM		4
    102 #  endif
    103 #  if (defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || \
    104 	defined(__SH4_SINGLE_ONLY__))
    105 #    define LG_QUANTUM		4
    106 #  endif
    107 #  ifdef __tile__
    108 #    define LG_QUANTUM		4
    109 #  endif
    110 #  ifdef __le32__
    111 #    define LG_QUANTUM		4
    112 #  endif
    113 #  ifndef LG_QUANTUM
    114 #    error "Unknown minimum alignment for architecture; specify via "
    115 	 "--with-lg-quantum"
    116 #  endif
    117 #endif
    118 
    119 #define QUANTUM			((size_t)(1U << LG_QUANTUM))
    120 #define QUANTUM_MASK		(QUANTUM - 1)
    121 
    122 /* Return the smallest quantum multiple that is >= a. */
    123 #define QUANTUM_CEILING(a)						\
    124 	(((a) + QUANTUM_MASK) & ~QUANTUM_MASK)
    125 
    126 #define LONG			((size_t)(1U << LG_SIZEOF_LONG))
    127 #define LONG_MASK		(LONG - 1)
    128 
    129 /* Return the smallest long multiple that is >= a. */
    130 #define LONG_CEILING(a)							\
    131 	(((a) + LONG_MASK) & ~LONG_MASK)
    132 
    133 #define SIZEOF_PTR		(1U << LG_SIZEOF_PTR)
    134 #define PTR_MASK		(SIZEOF_PTR - 1)
    135 
    136 /* Return the smallest (void *) multiple that is >= a. */
    137 #define PTR_CEILING(a)							\
    138 	(((a) + PTR_MASK) & ~PTR_MASK)
    139 
    140 /*
    141  * Maximum size of L1 cache line.  This is used to avoid cache line aliasing.
    142  * In addition, this controls the spacing of cacheline-spaced size classes.
    143  *
    144  * CACHELINE cannot be based on LG_CACHELINE because __declspec(align()) can
    145  * only handle raw constants.
    146  */
    147 #define LG_CACHELINE		6
    148 #define CACHELINE		64
    149 #define CACHELINE_MASK		(CACHELINE - 1)
    150 
    151 /* Return the smallest cacheline multiple that is >= s. */
    152 #define CACHELINE_CEILING(s)						\
    153 	(((s) + CACHELINE_MASK) & ~CACHELINE_MASK)
    154 
    155 /* Return the nearest aligned address at or below a. */
    156 #define ALIGNMENT_ADDR2BASE(a, alignment)				\
    157 	((void *)((uintptr_t)(a) & ((~(alignment)) + 1)))
    158 
    159 /* Return the offset between a and the nearest aligned address at or below a. */
    160 #define ALIGNMENT_ADDR2OFFSET(a, alignment)				\
    161 	((size_t)((uintptr_t)(a) & (alignment - 1)))
    162 
    163 /* Return the smallest alignment multiple that is >= s. */
    164 #define ALIGNMENT_CEILING(s, alignment)					\
    165 	(((s) + (alignment - 1)) & ((~(alignment)) + 1))
    166 
    167 /* Declare a variable-length array. */
    168 #if __STDC_VERSION__ < 199901L
    169 #  ifdef _MSC_VER
    170 #    include <malloc.h>
    171 #    define alloca _alloca
    172 #  else
    173 #    ifdef JEMALLOC_HAS_ALLOCA_H
    174 #      include <alloca.h>
    175 #    else
    176 #      include <stdlib.h>
    177 #    endif
    178 #  endif
    179 #  define VARIABLE_ARRAY(type, name, count) \
    180 	type *name = alloca(sizeof(type) * (count))
    181 #else
    182 #  define VARIABLE_ARRAY(type, name, count) type name[(count)]
    183 #endif
    184 
    185 #endif /* JEMALLOC_INTERNAL_TYPES_H */
    186