12a6845b6c
Use $((...)) for math in size_classes.h rather than expr, because it is much faster. This is not supported syntax in the classic Bourne shell, but all modern sh implementations support it, including bash, zsh, and ash.
133 lines
3.2 KiB
Bash
Executable File
133 lines
3.2 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# The following limits are chosen such that they cover all supported platforms.
|
|
|
|
# Range of quanta.
|
|
lg_qmin=3
|
|
lg_qmax=4
|
|
|
|
# The range of tiny size classes is [2^lg_tmin..2^(lg_q-1)].
|
|
lg_tmin=3
|
|
|
|
# Range of page sizes.
|
|
lg_pmin=12
|
|
lg_pmax=16
|
|
|
|
pow2() {
|
|
e=$1
|
|
pow2_result=1
|
|
while [ ${e} -gt 0 ] ; do
|
|
pow2_result=$((${pow2_result} + ${pow2_result}))
|
|
e=$((${e} - 1))
|
|
done
|
|
}
|
|
|
|
cat <<EOF
|
|
/* This file was automatically generated by size_classes.sh. */
|
|
/******************************************************************************/
|
|
#ifdef JEMALLOC_H_TYPES
|
|
|
|
EOF
|
|
|
|
lg_q=${lg_qmin}
|
|
while [ ${lg_q} -le ${lg_qmax} ] ; do
|
|
lg_t=${lg_tmin}
|
|
while [ ${lg_t} -le ${lg_q} ] ; do
|
|
lg_p=${lg_pmin}
|
|
while [ ${lg_p} -le ${lg_pmax} ] ; do
|
|
cat <<EOF
|
|
#if (LG_TINY_MIN == ${lg_t} && LG_QUANTUM == ${lg_q} && LG_PAGE == ${lg_p})
|
|
#define SIZE_CLASSES_DEFINED
|
|
EOF
|
|
pow2 ${lg_q}; q=${pow2_result}
|
|
pow2 ${lg_t}; t=${pow2_result}
|
|
pow2 ${lg_p}; p=${pow2_result}
|
|
bin=0
|
|
psz=0
|
|
sz=${t}
|
|
delta=$((${sz} - ${psz}))
|
|
cat <<EOF
|
|
/* SIZE_CLASS(bin, delta, sz) */
|
|
#define SIZE_CLASSES \\
|
|
EOF
|
|
|
|
# Tiny size classes.
|
|
while [ ${sz} -lt ${q} ] ; do
|
|
cat <<EOF
|
|
SIZE_CLASS(${bin}, ${delta}, ${sz}) \\
|
|
EOF
|
|
bin=$((${bin} + 1))
|
|
psz=${sz}
|
|
sz=$((${sz} + ${sz}))
|
|
delta=$((${sz} - ${psz}))
|
|
done
|
|
# Quantum-multiple size classes. For each doubling of sz, as many as 4
|
|
# size classes exist. Their spacing is the greater of:
|
|
# - q
|
|
# - sz/4, where sz is a power of 2
|
|
while [ ${sz} -lt ${p} ] ; do
|
|
if [ ${sz} -ge $((${q} * 4)) ] ; then
|
|
i=$((${sz} / 4))
|
|
else
|
|
i=${q}
|
|
fi
|
|
next_2pow=$((${sz} * 2))
|
|
while [ ${sz} -lt $next_2pow ] ; do
|
|
cat <<EOF
|
|
SIZE_CLASS(${bin}, ${delta}, ${sz}) \\
|
|
EOF
|
|
bin=$((${bin} + 1))
|
|
psz=${sz}
|
|
sz=$((${sz} + ${i}))
|
|
delta=$((${sz} - ${psz}))
|
|
done
|
|
done
|
|
cat <<EOF
|
|
|
|
#define NBINS ${bin}
|
|
#define SMALL_MAXCLASS ${psz}
|
|
#endif
|
|
|
|
EOF
|
|
lg_p=$((${lg_p} + 1))
|
|
done
|
|
lg_t=$((${lg_t} + 1))
|
|
done
|
|
lg_q=$((${lg_q} + 1))
|
|
done
|
|
|
|
cat <<EOF
|
|
#ifndef SIZE_CLASSES_DEFINED
|
|
# error "No size class definitions match configuration"
|
|
#endif
|
|
#undef SIZE_CLASSES_DEFINED
|
|
/*
|
|
* The small_size2bin lookup table uses uint8_t to encode each bin index, so we
|
|
* cannot support more than 256 small size classes. Further constrain NBINS to
|
|
* 255 to support prof_promote, since all small size classes, plus a "not
|
|
* small" size class must be stored in 8 bits of arena_chunk_map_t's bits
|
|
* field.
|
|
*/
|
|
#if (NBINS > 255)
|
|
# error "Too many small size classes"
|
|
#endif
|
|
|
|
#endif /* JEMALLOC_H_TYPES */
|
|
/******************************************************************************/
|
|
#ifdef JEMALLOC_H_STRUCTS
|
|
|
|
|
|
#endif /* JEMALLOC_H_STRUCTS */
|
|
/******************************************************************************/
|
|
#ifdef JEMALLOC_H_EXTERNS
|
|
|
|
|
|
#endif /* JEMALLOC_H_EXTERNS */
|
|
/******************************************************************************/
|
|
#ifdef JEMALLOC_H_INLINES
|
|
|
|
|
|
#endif /* JEMALLOC_H_INLINES */
|
|
/******************************************************************************/
|
|
EOF
|