Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/ksh93
- # poll(1) builtin test
- typeset -T circus_t=(
- typeset fifo_name
- integer in_fd
- integer out_fd
- function cinit
- {
- integer pid
- # fixme: we can't assign fd directly because ast-ksh.2012-08-13 has a bug
- # with "redirect"
- integer fd
- _.fifo_name="$1"
- rm -f "${_.fifo_name}"
- mkfifo "${_.fifo_name}"
- # little "trick" with fifos - "redirect" would block if
- # there is no reader... so we create one in a
- # sub-process and kill it below after we opened the fd
- { redirect {dummy}<"${_.fifo_name}" ; for (( ;; )) ; do sleep 3600 ; done ; } &
- (( pid=$! ))
- redirect {fd}>"${_.fifo_name}"
- (( _.out_fd=fd ))
- #printf '%s: outfd=%d\n' "${_.fifo_name}" _.out_fd
- kill $pid ; wait
- redirect {fd}<"${_.fifo_name}"
- (( _.in_fd=fd ))
- #printf '%s: infd=%d\n' "${_.fifo_name}" _.in_fd
- }
- function cleanup
- {
- rm "${_.fifo_name}"
- }
- )
- function main
- {
- integer i
- typeset name subname
- typeset -M toupper up
- #set -x
- circus_t -A ar
- for name in 'a' 'b' 'c' 'd' ; do
- ar[${name}].cinit "fifo_${name}"
- done
- compound -A pollfd
- for name in "${!ar[@]}" ; do
- subname="fifo_${name}_in"
- pollfd[${subname}]=( fd=${ar[${name}].in_fd} events=( pollin='true' pollerr='false' pollhup='false' ) revents=() )
- subname="fifo_${name}_out"
- pollfd[${subname}]=( fd=${ar[${name}].out_fd} events=( pollout='true' pollerr='false' pollhup='false' ) revents=() )
- done
- print -v pollfd
- for (( i=0 ; i < 120 ; i++ )) ; do
- poll -t5 pollfd || true
- # print results table
- printf '|'
- for name in "${!ar[@]}" ; do
- up="$name"
- subname="fifo_${name}_in"
- if ${pollfd[${subname}].revents.pollin} ; then printf '%sI+' "${up}" ; else printf '...' ; fi
- if ${pollfd[${subname}].revents.pollhup} ; then printf '%sIH' "${up}" ; else printf '...' ; fi
- if ${pollfd[${subname}].revents.pollerr} ; then printf '%sIE' "${up}" ; else printf '...' ; fi
- subname="fifo_${name}_out"
- if ${pollfd[${subname}].revents.pollout} ; then printf '%sO+' "${up}" ; else printf '...' ; fi
- if ${pollfd[${subname}].revents.pollhup} ; then printf '%sOH' "${up}" ; else printf '...' ; fi
- if ${pollfd[${subname}].revents.pollerr} ; then printf '%sOE' "${up}" ; else printf '...' ; fi
- printf '|'
- done
- printf '\n'
- # pass token around
- if ${pollfd[fifo_a_in].revents.pollin} && ${pollfd[fifo_b_out].revents.pollout}; then
- if read -u${pollfd[fifo_a_in].fd} -N1 x ; then
- print -u${pollfd[fifo_b_out].fd} -f "%s" "$x"
- fi
- fi
- if ${pollfd[fifo_b_in].revents.pollin} && ${pollfd[fifo_c_out].revents.pollout}; then
- if read -u${pollfd[fifo_b_in].fd} -N1 x ; then
- print -u${pollfd[fifo_c_out].fd} -f "%s" "$x"
- fi
- fi
- if ${pollfd[fifo_c_in].revents.pollin} && ${pollfd[fifo_d_out].revents.pollout}; then
- if read -u${pollfd[fifo_c_in].fd} -N1 x ; then
- print -u${pollfd[fifo_d_out].fd} -f "%s" "$x"
- fi
- fi
- if ${pollfd[fifo_d_in].revents.pollin} && ${pollfd[fifo_a_out].revents.pollout}; then
- if read -u${pollfd[fifo_d_in].fd} -N1 x ; then
- print -u${pollfd[fifo_a_out].fd} -f "%s" "$x"
- fi
- fi
- # fixme: send HUP around
- # send start token
- (( i==0 )) && print -u${pollfd[fifo_a_out].fd} -f '\u[20ac]'
- done
- return 0
- }
- set -o nounset
- set -o errexit
- builtin mkfifo
- builtin poll
- builtin rm
- main
Add Comment
Please, Sign In to add comment