72ca7220f2
This avoids fork/exec()ing in loops, as echo is a builtin, and makes size_classes.sh much faster (from > 10s to < 0.2s on mingw on my machine).
123 lines
3.2 KiB
Bash
Executable File
123 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
|
|
echo "#if (LG_TINY_MIN == ${lg_t} && LG_QUANTUM == ${lg_q} && LG_PAGE == ${lg_p})"
|
|
echo "#define SIZE_CLASSES_DEFINED"
|
|
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}))
|
|
echo "/* SIZE_CLASS(bin, delta, sz) */"
|
|
echo "#define SIZE_CLASSES \\"
|
|
|
|
# Tiny size classes.
|
|
while [ ${sz} -lt ${q} ] ; do
|
|
echo " SIZE_CLASS(${bin}, ${delta}, ${sz}) \\"
|
|
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
|
|
echo " SIZE_CLASS(${bin}, ${delta}, ${sz}) \\"
|
|
bin=$((${bin} + 1))
|
|
psz=${sz}
|
|
sz=$((${sz} + ${i}))
|
|
delta=$((${sz} - ${psz}))
|
|
done
|
|
done
|
|
echo
|
|
echo "#define NBINS ${bin}"
|
|
echo "#define SMALL_MAXCLASS ${psz}"
|
|
echo "#endif"
|
|
echo
|
|
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
|