17c2fbfb3SApril Chin######################################################################## 27c2fbfb3SApril Chin# # 37c2fbfb3SApril Chin# This software is part of the ast package # 4*3e14f97fSRoger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property # 57c2fbfb3SApril Chin# and is licensed under the # 67c2fbfb3SApril Chin# Common Public License, Version 1.0 # 77c2fbfb3SApril Chin# by AT&T Intellectual Property # 87c2fbfb3SApril Chin# # 97c2fbfb3SApril Chin# A copy of the License is available at # 107c2fbfb3SApril Chin# http://www.opensource.org/licenses/cpl1.0.txt # 117c2fbfb3SApril Chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 127c2fbfb3SApril Chin# # 137c2fbfb3SApril Chin# Information and Software Systems Research # 147c2fbfb3SApril Chin# AT&T Research # 157c2fbfb3SApril Chin# Florham Park NJ # 167c2fbfb3SApril Chin# # 177c2fbfb3SApril Chin# David Korn <dgk@research.att.com> # 187c2fbfb3SApril Chin# # 197c2fbfb3SApril Chin######################################################################## 207c2fbfb3SApril Chinfunction err_exit 217c2fbfb3SApril Chin{ 227c2fbfb3SApril Chin print -u2 -n "\t" 237c2fbfb3SApril Chin print -u2 -r ${Command}[$1]: "${@:2}" 247c2fbfb3SApril Chin (( Errors+=1 )) 257c2fbfb3SApril Chin} 267c2fbfb3SApril Chin 277c2fbfb3SApril Chinalias err_exit='err_exit $LINENO' 287c2fbfb3SApril Chin 29*3e14f97fSRoger A. Faulknerfloat DELAY=${1:-0.2} 307c2fbfb3SApril Chininteger FOREGROUND=10 BACKGROUND=2 Errors=0 317c2fbfb3SApril Chin 327c2fbfb3SApril Chins=$($SHELL -c ' 337c2fbfb3SApril Chininteger i foreground=0 background=0 347c2fbfb3SApril Chinfloat delay='$DELAY' d=0 s=0 357c2fbfb3SApril Chin 367c2fbfb3SApril Chinset --errexit 377c2fbfb3SApril Chin 387c2fbfb3SApril Chintrap "(( background++ ))" CHLD 397c2fbfb3SApril Chin 407c2fbfb3SApril Chin(( d = delay )) 417c2fbfb3SApril Chinfor ((i = 0; i < '$BACKGROUND'; i++)) 427c2fbfb3SApril Chindo sleep $d & 437c2fbfb3SApril Chin (( d *= 4 )) 447c2fbfb3SApril Chin (( s += d )) 457c2fbfb3SApril Chindone 467c2fbfb3SApril Chinfor ((i = 0; i < '$FOREGROUND'; i++)) 477c2fbfb3SApril Chindo (( foreground++ )) 487c2fbfb3SApril Chin sleep $delay 497c2fbfb3SApril Chin (( s -= delay )) 507c2fbfb3SApril Chin $SHELL -c : > /dev/null # foreground does not generate SIGCHLD 517c2fbfb3SApril Chindone 527c2fbfb3SApril Chinif (( (s += delay) < 1 )) 537c2fbfb3SApril Chinthen (( s = 1 )) 547c2fbfb3SApril Chinfi 557c2fbfb3SApril Chinsleep $s 567c2fbfb3SApril Chinwait 577c2fbfb3SApril Chinprint foreground=$foreground background=$background 587c2fbfb3SApril Chin') || err_exit "test loop failed" 597c2fbfb3SApril Chin 607c2fbfb3SApril Chineval $s 617c2fbfb3SApril Chin 6234f9b3eeSRoland Mainz(( foreground == FOREGROUND )) || err_exit "expected '$FOREGROUND foreground' -- got '$foreground' (DELAY=$DELAY)" 6334f9b3eeSRoland Mainz(( background == BACKGROUND )) || err_exit "expected '$BACKGROUND background' -- got '$background' (DELAY=$DELAY)" 6434f9b3eeSRoland Mainz 6534f9b3eeSRoland Mainzset --noerrexit 6634f9b3eeSRoland Mainz 6734f9b3eeSRoland Mainzif [[ ${.sh.version} == Version?*([[:upper:]])J* ]] 6834f9b3eeSRoland Mainzthen 6934f9b3eeSRoland Mainz 7034f9b3eeSRoland Mainz jobmax=4 7134f9b3eeSRoland Mainz got=$($SHELL -c ' 7234f9b3eeSRoland Mainz JOBMAX='$jobmax' JOBCOUNT=$(('$jobmax'*2)) 7334f9b3eeSRoland Mainz integer running=0 maxrunning=0 7434f9b3eeSRoland Mainz trap "((running--))" CHLD 7534f9b3eeSRoland Mainz for ((i=0; i<JOBCOUNT; i++)) 7634f9b3eeSRoland Mainz do sleep 1 & 7734f9b3eeSRoland Mainz if ((++running > maxrunning)) 7834f9b3eeSRoland Mainz then ((maxrunning=running)) 7934f9b3eeSRoland Mainz fi 8034f9b3eeSRoland Mainz done 8134f9b3eeSRoland Mainz wait 8234f9b3eeSRoland Mainz print running=$running maxrunning=$maxrunning 8334f9b3eeSRoland Mainz ') 8434f9b3eeSRoland Mainz exp='running=0 maxrunning='$jobmax 8534f9b3eeSRoland Mainz [[ $got == $exp ]] || err_exit "SIGCHLD trap queueing failed -- expected '$exp', got '$got'" 8634f9b3eeSRoland Mainz 8734f9b3eeSRoland Mainz got=$($SHELL -c ' 8834f9b3eeSRoland Mainz typeset -A proc 8934f9b3eeSRoland Mainz 9034f9b3eeSRoland Mainz trap " 9134f9b3eeSRoland Mainz print \${proc[\$!].name} \${proc[\$!].status} \$? 9234f9b3eeSRoland Mainz unset proc[\$!] 9334f9b3eeSRoland Mainz " CHLD 9434f9b3eeSRoland Mainz 9534f9b3eeSRoland Mainz { sleep 3; print a; exit 1; } & 9634f9b3eeSRoland Mainz proc[$!]=( name=a status=1 ) 9734f9b3eeSRoland Mainz 9834f9b3eeSRoland Mainz { sleep 2; print b; exit 2; } & 9934f9b3eeSRoland Mainz proc[$!]=( name=b status=2 ) 10034f9b3eeSRoland Mainz 10134f9b3eeSRoland Mainz { sleep 1; print c; exit 3; } & 10234f9b3eeSRoland Mainz proc[$!]=( name=c status=3 ) 10334f9b3eeSRoland Mainz 10434f9b3eeSRoland Mainz while (( ${#proc[@]} )) 10534f9b3eeSRoland Mainz do sleep -s 10634f9b3eeSRoland Mainz done 10734f9b3eeSRoland Mainz ') 10834f9b3eeSRoland Mainz exp='c\nc 3 3\nb\nb 2 2\na\na 1 1' 10934f9b3eeSRoland Mainz [[ $got == $exp ]] || err_exit "SIGCHLD trap queueing failed -- expected $(printf %q "$exp"), got $(printf %q "$got")" 11034f9b3eeSRoland Mainz 11134f9b3eeSRoland Mainzfi 1127c2fbfb3SApril Chin 113*3e14f97fSRoger A. Faulkner{ 114*3e14f97fSRoger A. Faulknergot=$( ( sleep 1;print $'\n') | $SHELL -c 'function handler { : ;} 115*3e14f97fSRoger A. Faulkner trap handler CHLD; sleep .3 & IFS= read; print good') 116*3e14f97fSRoger A. Faulkner} 2> /dev/null 117*3e14f97fSRoger A. Faulkner[[ $got == good ]] || err_exit 'SIGCLD handler effects read behavior' 118*3e14f97fSRoger A. Faulkner 119*3e14f97fSRoger A. Faulknerset -- $( 120*3e14f97fSRoger A. Faulkner ( 121*3e14f97fSRoger A. Faulkner $SHELL -xc $' 122*3e14f97fSRoger A. Faulkner trap \'wait $!; print $! $?\' CHLD 123*3e14f97fSRoger A. Faulkner { sleep 0.1; exit 9; } & 124*3e14f97fSRoger A. Faulkner print $! 125*3e14f97fSRoger A. Faulkner sleep 0.5 126*3e14f97fSRoger A. Faulkner ' 127*3e14f97fSRoger A. Faulkner ) 2>/dev/null; print $? 128*3e14f97fSRoger A. Faulkner) 129*3e14f97fSRoger A. Faulknerif (( $# != 4 )) 130*3e14f97fSRoger A. Faulknerthen err_exit "CHLD trap failed -- expected 4 args, got $#" 131*3e14f97fSRoger A. Faulknerelif (( $4 != 0 )) 132*3e14f97fSRoger A. Faulknerthen err_exit "CHLD trap failed -- exit code $4" 133*3e14f97fSRoger A. Faulknerelif (( $1 != $2 )) 134*3e14f97fSRoger A. Faulknerthen err_exit "child pid mismatch -- got '$1' != '$2'" 135*3e14f97fSRoger A. Faulknerelif (( $3 != 9 )) 136*3e14f97fSRoger A. Faulknerthen err_exit "child status mismatch -- expected '9', got '$3'" 137*3e14f97fSRoger A. Faulknerfi 138*3e14f97fSRoger A. Faulkner 1397c2fbfb3SApril Chinexit $((Errors)) 140