#ifndef JEMALLOC_INTERNAL_TYPES_H
|
#define JEMALLOC_INTERNAL_TYPES_H
|
|
#include "jemalloc/internal/quantum.h"
|
|
/* Page size index type. */
|
typedef unsigned pszind_t;
|
|
/* Size class index type. */
|
typedef unsigned szind_t;
|
|
/* Processor / core id type. */
|
typedef int malloc_cpuid_t;
|
|
/*
|
* Flags bits:
|
*
|
* a: arena
|
* t: tcache
|
* 0: unused
|
* z: zero
|
* n: alignment
|
*
|
* aaaaaaaa aaaatttt tttttttt 0znnnnnn
|
*/
|
#define MALLOCX_ARENA_BITS 12
|
#define MALLOCX_TCACHE_BITS 12
|
#define MALLOCX_LG_ALIGN_BITS 6
|
#define MALLOCX_ARENA_SHIFT 20
|
#define MALLOCX_TCACHE_SHIFT 8
|
#define MALLOCX_ARENA_MASK \
|
(((1 << MALLOCX_ARENA_BITS) - 1) << MALLOCX_ARENA_SHIFT)
|
/* NB: Arena index bias decreases the maximum number of arenas by 1. */
|
#define MALLOCX_ARENA_LIMIT ((1 << MALLOCX_ARENA_BITS) - 1)
|
#define MALLOCX_TCACHE_MASK \
|
(((1 << MALLOCX_TCACHE_BITS) - 1) << MALLOCX_TCACHE_SHIFT)
|
#define MALLOCX_TCACHE_MAX ((1 << MALLOCX_TCACHE_BITS) - 3)
|
#define MALLOCX_LG_ALIGN_MASK ((1 << MALLOCX_LG_ALIGN_BITS) - 1)
|
/* Use MALLOCX_ALIGN_GET() if alignment may not be specified in flags. */
|
#define MALLOCX_ALIGN_GET_SPECIFIED(flags) \
|
(ZU(1) << (flags & MALLOCX_LG_ALIGN_MASK))
|
#define MALLOCX_ALIGN_GET(flags) \
|
(MALLOCX_ALIGN_GET_SPECIFIED(flags) & (SIZE_T_MAX-1))
|
#define MALLOCX_ZERO_GET(flags) \
|
((bool)(flags & MALLOCX_ZERO))
|
|
#define MALLOCX_TCACHE_GET(flags) \
|
(((unsigned)((flags & MALLOCX_TCACHE_MASK) >> MALLOCX_TCACHE_SHIFT)) - 2)
|
#define MALLOCX_ARENA_GET(flags) \
|
(((unsigned)(((unsigned)flags) >> MALLOCX_ARENA_SHIFT)) - 1)
|
|
/* Smallest size class to support. */
|
#define TINY_MIN (1U << LG_TINY_MIN)
|
|
#define LONG ((size_t)(1U << LG_SIZEOF_LONG))
|
#define LONG_MASK (LONG - 1)
|
|
/* Return the smallest long multiple that is >= a. */
|
#define LONG_CEILING(a) \
|
(((a) + LONG_MASK) & ~LONG_MASK)
|
|
#define SIZEOF_PTR (1U << LG_SIZEOF_PTR)
|
#define PTR_MASK (SIZEOF_PTR - 1)
|
|
/* Return the smallest (void *) multiple that is >= a. */
|
#define PTR_CEILING(a) \
|
(((a) + PTR_MASK) & ~PTR_MASK)
|
|
/*
|
* Maximum size of L1 cache line. This is used to avoid cache line aliasing.
|
* In addition, this controls the spacing of cacheline-spaced size classes.
|
*
|
* CACHELINE cannot be based on LG_CACHELINE because __declspec(align()) can
|
* only handle raw constants.
|
*/
|
#define LG_CACHELINE 6
|
#define CACHELINE 64
|
#define CACHELINE_MASK (CACHELINE - 1)
|
|
/* Return the smallest cacheline multiple that is >= s. */
|
#define CACHELINE_CEILING(s) \
|
(((s) + CACHELINE_MASK) & ~CACHELINE_MASK)
|
|
/* Return the nearest aligned address at or below a. */
|
#define ALIGNMENT_ADDR2BASE(a, alignment) \
|
((void *)((uintptr_t)(a) & ((~(alignment)) + 1)))
|
|
/* Return the offset between a and the nearest aligned address at or below a. */
|
#define ALIGNMENT_ADDR2OFFSET(a, alignment) \
|
((size_t)((uintptr_t)(a) & (alignment - 1)))
|
|
/* Return the smallest alignment multiple that is >= s. */
|
#define ALIGNMENT_CEILING(s, alignment) \
|
(((s) + (alignment - 1)) & ((~(alignment)) + 1))
|
|
/* Declare a variable-length array. */
|
#if __STDC_VERSION__ < 199901L
|
# ifdef _MSC_VER
|
# include <malloc.h>
|
# define alloca _alloca
|
# else
|
# ifdef JEMALLOC_HAS_ALLOCA_H
|
# include <alloca.h>
|
# else
|
# include <stdlib.h>
|
# endif
|
# endif
|
# define VARIABLE_ARRAY(type, name, count) \
|
type *name = alloca(sizeof(type) * (count))
|
#else
|
# define VARIABLE_ARRAY(type, name, count) type name[(count)]
|
#endif
|
|
#endif /* JEMALLOC_INTERNAL_TYPES_H */
|