kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

parallel.sh (1733B)


      1 # test/lib/parallel.sh - small shared helpers for parallel shell harnesses.
      2 #
      3 # Harnesses keep ownership of their result format and counters. This file
      4 # only parses KIT_TEST_JOBS and throttles background jobs so callers can
      5 # write per-case logs and replay them serially.
      6 
      7 kit_parallel_jobs() {
      8     local requested="${KIT_TEST_JOBS:-auto}"
      9     local n
     10 
     11     case "$requested" in
     12         ""|1)
     13             echo 1
     14             return
     15             ;;
     16         auto)
     17             n="$(getconf _NPROCESSORS_ONLN 2>/dev/null || true)"
     18             if [ -z "$n" ]; then
     19                 n="$(sysctl -n hw.ncpu 2>/dev/null || true)"
     20             fi
     21             case "$n" in
     22                 ''|*[!0-9]*) n=1 ;;
     23             esac
     24             # Keep default auto parallelism modest; these harnesses often
     25             # launch compilers and object dumpers rather than tiny commands.
     26             [ "$n" -gt 8 ] && n=8
     27             [ "$n" -lt 1 ] && n=1
     28             echo "$n"
     29             return
     30             ;;
     31         *[!0-9]*)
     32             printf 'invalid KIT_TEST_JOBS=%s\n' "$requested" >&2
     33             return 2
     34             ;;
     35         *)
     36             [ "$requested" -lt 1 ] && requested=1
     37             echo "$requested"
     38             return
     39             ;;
     40     esac
     41 }
     42 
     43 kit_parallel_running_count() {
     44     jobs -pr | wc -l | tr -d '[:space:]'
     45 }
     46 
     47 kit_parallel_wait_for_slot() {
     48     local max_jobs="$1"
     49 
     50     [ "$max_jobs" -le 1 ] && return 0
     51     while [ "$(kit_parallel_running_count)" -ge "$max_jobs" ]; do
     52         sleep 0.05
     53     done
     54 }
     55 
     56 kit_parallel_run() {
     57     local max_jobs="$1"
     58     shift
     59 
     60     if [ "$max_jobs" -le 1 ]; then
     61         "$@"
     62         return $?
     63     fi
     64 
     65     kit_parallel_wait_for_slot "$max_jobs"
     66     "$@" &
     67 }
     68 
     69 kit_parallel_wait_all() {
     70     wait
     71 }