makepad/tools/run/fixture/program_stack.sh

33 lines
1.8 KiB
Bash
Executable file

#!/bin/sh
# program_stack.sh: JIT program threads run on program stacks (large lazily committed reservations
# with a guard; relax_base::stack::on_program_stack). stack/deep.rs recurses ~600 MiB deep, keeps a
# 256 MiB stack buffer and recurses on a spawned thread; stack/overflow.rs must end with a stack
# overflow report (MAKEPAD_RUN_STACK_GB=1), never hang or corrupt. Prints PROGRAM-STACK-OK or the
# failing case. Usage (workspace root, after cargo build --release -p makepad-run): TARGET=... program_stack.sh
here=$(cd "$(dirname "$0")" && pwd)
root=$(cd "$here/../../.." && pwd)
M=${TARGET:-$root/target/release}/makepad
export MAKEPAD_RUN_STD=${MAKEPAD_RUN_STD:-$root/libs/relax/compiler/std}
work=$(mktemp -d "${TMPDIR:-/tmp}/program_stack.XXXXXX") || exit 2
run() {
d=$work/$1; mkdir -p "$d/home" "$d/tmp"
shift
env MAKEPAD_HIDE_WINDOWS=1 MAKEPAD_MUTE=1 MAKEPAD_HOME="$d/home" TMPDIR="$d/tmp" MAKEPAD_RUN_HOME="$d/runhome" \
MAKEPAD_RUN_CACHE_DIR="$d/cache" "$@"
}
fail=0
for tier in "MAKEPAD_RUN_O1=always MAKEPAD_RUN_O3=0" "MAKEPAD_RUN_O3=1 MAKEPAD_RUN_O3_CALLS=1"; do
run deep env $tier "$M" test "$here/stack/deep.rs" > "$work/deep.out" 2> "$work/deep.err"
rc=$?
for want in "D deep 500000" "D buffer 8355840" "D thread 250000"; do
grep -q "^$want\$" "$work/deep.out" || { echo "program_stack: deep ($tier) rc $rc: missing '$want'"; tail -5 "$work/deep.err"; fail=1; }
done
done
run overflow env MAKEPAD_RUN_STACK_GB=1 "$M" test "$here/stack/overflow.rs" > "$work/ovf.out" 2> "$work/ovf.err"
rc=$?
if [ $rc = 0 ] || ! grep -q "stack overflow" "$work/ovf.err" "$work/ovf.out"; then
echo "program_stack: overflow rc $rc without a stack overflow report"; tail -5 "$work/ovf.err"; fail=1
fi
rm -r "$work"
[ $fail = 0 ] && echo PROGRAM-STACK-OK
exit $fail