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 }