18462SApril.Chin@Sun.COM######################################################################## 28462SApril.Chin@Sun.COM# # 38462SApril.Chin@Sun.COM# This software is part of the ast package # 4*12068SRoger.Faulkner@Oracle.COM# Copyright (c) 1982-2010 AT&T Intellectual Property # 58462SApril.Chin@Sun.COM# and is licensed under the # 68462SApril.Chin@Sun.COM# Common Public License, Version 1.0 # 78462SApril.Chin@Sun.COM# by AT&T Intellectual Property # 88462SApril.Chin@Sun.COM# # 98462SApril.Chin@Sun.COM# A copy of the License is available at # 108462SApril.Chin@Sun.COM# http://www.opensource.org/licenses/cpl1.0.txt # 118462SApril.Chin@Sun.COM# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 128462SApril.Chin@Sun.COM# # 138462SApril.Chin@Sun.COM# Information and Software Systems Research # 148462SApril.Chin@Sun.COM# AT&T Research # 158462SApril.Chin@Sun.COM# Florham Park NJ # 168462SApril.Chin@Sun.COM# # 178462SApril.Chin@Sun.COM# David Korn <dgk@research.att.com> # 188462SApril.Chin@Sun.COM# # 198462SApril.Chin@Sun.COM######################################################################## 208462SApril.Chin@Sun.COMfunction err_exit 218462SApril.Chin@Sun.COM{ 228462SApril.Chin@Sun.COM print -u2 -n "\t" 238462SApril.Chin@Sun.COM print -u2 -r ${Command}[$1]: "${@:2}" 248462SApril.Chin@Sun.COM (( Errors+=1 )) 258462SApril.Chin@Sun.COM} 268462SApril.Chin@Sun.COM 278462SApril.Chin@Sun.COMalias err_exit='err_exit $LINENO' 288462SApril.Chin@Sun.COM 29*12068SRoger.Faulkner@Oracle.COMfloat DELAY=${1:-0.2} 308462SApril.Chin@Sun.COMinteger FOREGROUND=10 BACKGROUND=2 Errors=0 318462SApril.Chin@Sun.COM 328462SApril.Chin@Sun.COMs=$($SHELL -c ' 338462SApril.Chin@Sun.COMinteger i foreground=0 background=0 348462SApril.Chin@Sun.COMfloat delay='$DELAY' d=0 s=0 358462SApril.Chin@Sun.COM 368462SApril.Chin@Sun.COMset --errexit 378462SApril.Chin@Sun.COM 388462SApril.Chin@Sun.COMtrap "(( background++ ))" CHLD 398462SApril.Chin@Sun.COM 408462SApril.Chin@Sun.COM(( d = delay )) 418462SApril.Chin@Sun.COMfor ((i = 0; i < '$BACKGROUND'; i++)) 428462SApril.Chin@Sun.COMdo sleep $d & 438462SApril.Chin@Sun.COM (( d *= 4 )) 448462SApril.Chin@Sun.COM (( s += d )) 458462SApril.Chin@Sun.COMdone 468462SApril.Chin@Sun.COMfor ((i = 0; i < '$FOREGROUND'; i++)) 478462SApril.Chin@Sun.COMdo (( foreground++ )) 488462SApril.Chin@Sun.COM sleep $delay 498462SApril.Chin@Sun.COM (( s -= delay )) 508462SApril.Chin@Sun.COM $SHELL -c : > /dev/null # foreground does not generate SIGCHLD 518462SApril.Chin@Sun.COMdone 528462SApril.Chin@Sun.COMif (( (s += delay) < 1 )) 538462SApril.Chin@Sun.COMthen (( s = 1 )) 548462SApril.Chin@Sun.COMfi 558462SApril.Chin@Sun.COMsleep $s 568462SApril.Chin@Sun.COMwait 578462SApril.Chin@Sun.COMprint foreground=$foreground background=$background 588462SApril.Chin@Sun.COM') || err_exit "test loop failed" 598462SApril.Chin@Sun.COM 608462SApril.Chin@Sun.COMeval $s 618462SApril.Chin@Sun.COM 6210898Sroland.mainz@nrubsig.org(( foreground == FOREGROUND )) || err_exit "expected '$FOREGROUND foreground' -- got '$foreground' (DELAY=$DELAY)" 6310898Sroland.mainz@nrubsig.org(( background == BACKGROUND )) || err_exit "expected '$BACKGROUND background' -- got '$background' (DELAY=$DELAY)" 6410898Sroland.mainz@nrubsig.org 6510898Sroland.mainz@nrubsig.orgset --noerrexit 6610898Sroland.mainz@nrubsig.org 6710898Sroland.mainz@nrubsig.orgif [[ ${.sh.version} == Version?*([[:upper:]])J* ]] 6810898Sroland.mainz@nrubsig.orgthen 6910898Sroland.mainz@nrubsig.org 7010898Sroland.mainz@nrubsig.org jobmax=4 7110898Sroland.mainz@nrubsig.org got=$($SHELL -c ' 7210898Sroland.mainz@nrubsig.org JOBMAX='$jobmax' JOBCOUNT=$(('$jobmax'*2)) 7310898Sroland.mainz@nrubsig.org integer running=0 maxrunning=0 7410898Sroland.mainz@nrubsig.org trap "((running--))" CHLD 7510898Sroland.mainz@nrubsig.org for ((i=0; i<JOBCOUNT; i++)) 7610898Sroland.mainz@nrubsig.org do sleep 1 & 7710898Sroland.mainz@nrubsig.org if ((++running > maxrunning)) 7810898Sroland.mainz@nrubsig.org then ((maxrunning=running)) 7910898Sroland.mainz@nrubsig.org fi 8010898Sroland.mainz@nrubsig.org done 8110898Sroland.mainz@nrubsig.org wait 8210898Sroland.mainz@nrubsig.org print running=$running maxrunning=$maxrunning 8310898Sroland.mainz@nrubsig.org ') 8410898Sroland.mainz@nrubsig.org exp='running=0 maxrunning='$jobmax 8510898Sroland.mainz@nrubsig.org [[ $got == $exp ]] || err_exit "SIGCHLD trap queueing failed -- expected '$exp', got '$got'" 8610898Sroland.mainz@nrubsig.org 8710898Sroland.mainz@nrubsig.org got=$($SHELL -c ' 8810898Sroland.mainz@nrubsig.org typeset -A proc 8910898Sroland.mainz@nrubsig.org 9010898Sroland.mainz@nrubsig.org trap " 9110898Sroland.mainz@nrubsig.org print \${proc[\$!].name} \${proc[\$!].status} \$? 9210898Sroland.mainz@nrubsig.org unset proc[\$!] 9310898Sroland.mainz@nrubsig.org " CHLD 9410898Sroland.mainz@nrubsig.org 9510898Sroland.mainz@nrubsig.org { sleep 3; print a; exit 1; } & 9610898Sroland.mainz@nrubsig.org proc[$!]=( name=a status=1 ) 9710898Sroland.mainz@nrubsig.org 9810898Sroland.mainz@nrubsig.org { sleep 2; print b; exit 2; } & 9910898Sroland.mainz@nrubsig.org proc[$!]=( name=b status=2 ) 10010898Sroland.mainz@nrubsig.org 10110898Sroland.mainz@nrubsig.org { sleep 1; print c; exit 3; } & 10210898Sroland.mainz@nrubsig.org proc[$!]=( name=c status=3 ) 10310898Sroland.mainz@nrubsig.org 10410898Sroland.mainz@nrubsig.org while (( ${#proc[@]} )) 10510898Sroland.mainz@nrubsig.org do sleep -s 10610898Sroland.mainz@nrubsig.org done 10710898Sroland.mainz@nrubsig.org ') 10810898Sroland.mainz@nrubsig.org exp='c\nc 3 3\nb\nb 2 2\na\na 1 1' 10910898Sroland.mainz@nrubsig.org [[ $got == $exp ]] || err_exit "SIGCHLD trap queueing failed -- expected $(printf %q "$exp"), got $(printf %q "$got")" 11010898Sroland.mainz@nrubsig.org 11110898Sroland.mainz@nrubsig.orgfi 1128462SApril.Chin@Sun.COM 113*12068SRoger.Faulkner@Oracle.COM{ 114*12068SRoger.Faulkner@Oracle.COMgot=$( ( sleep 1;print $'\n') | $SHELL -c 'function handler { : ;} 115*12068SRoger.Faulkner@Oracle.COM trap handler CHLD; sleep .3 & IFS= read; print good') 116*12068SRoger.Faulkner@Oracle.COM} 2> /dev/null 117*12068SRoger.Faulkner@Oracle.COM[[ $got == good ]] || err_exit 'SIGCLD handler effects read behavior' 118*12068SRoger.Faulkner@Oracle.COM 119*12068SRoger.Faulkner@Oracle.COMset -- $( 120*12068SRoger.Faulkner@Oracle.COM ( 121*12068SRoger.Faulkner@Oracle.COM $SHELL -xc $' 122*12068SRoger.Faulkner@Oracle.COM trap \'wait $!; print $! $?\' CHLD 123*12068SRoger.Faulkner@Oracle.COM { sleep 0.1; exit 9; } & 124*12068SRoger.Faulkner@Oracle.COM print $! 125*12068SRoger.Faulkner@Oracle.COM sleep 0.5 126*12068SRoger.Faulkner@Oracle.COM ' 127*12068SRoger.Faulkner@Oracle.COM ) 2>/dev/null; print $? 128*12068SRoger.Faulkner@Oracle.COM) 129*12068SRoger.Faulkner@Oracle.COMif (( $# != 4 )) 130*12068SRoger.Faulkner@Oracle.COMthen err_exit "CHLD trap failed -- expected 4 args, got $#" 131*12068SRoger.Faulkner@Oracle.COMelif (( $4 != 0 )) 132*12068SRoger.Faulkner@Oracle.COMthen err_exit "CHLD trap failed -- exit code $4" 133*12068SRoger.Faulkner@Oracle.COMelif (( $1 != $2 )) 134*12068SRoger.Faulkner@Oracle.COMthen err_exit "child pid mismatch -- got '$1' != '$2'" 135*12068SRoger.Faulkner@Oracle.COMelif (( $3 != 9 )) 136*12068SRoger.Faulkner@Oracle.COMthen err_exit "child status mismatch -- expected '9', got '$3'" 137*12068SRoger.Faulkner@Oracle.COMfi 138*12068SRoger.Faulkner@Oracle.COM 1398462SApril.Chin@Sun.COMexit $((Errors)) 140