On 07/20/10 14:47, Eric Blake wrote a bunch of good questions, ending with:
> And how does signal handling fit in with interrupting a child test? OK, you're right, a plain pipe is not going to work. How about this much-smaller fix instead? It builds on your idea to make sure that the 'read at_token' commands succeed. --- general.m4 2010-07-20 14:28:32.835139154 -0700 +++ /tmp/general.m4 2010-07-20 14:48:26.295135987 -0700 @@ -1386,7 +1386,7 @@ dnl optimize away the _AT_CHECK subshell dnl Ignore PIPE signals that stem from writing back the token. trap "" PIPE echo stop > "$at_stop_file" - echo token >&AT_JOB_FIFO_FD + echo >&AT_JOB_FIFO_FD dnl Do not reraise the default PIPE handler. dnl It wreaks havoc with ksh, see above. dnl trap - 13 @@ -1401,7 +1401,7 @@ dnl kill -13 $$ at_failed=: fi at_fn_group_postprocess - echo token >&AT_JOB_FIFO_FD + echo >&AT_JOB_FIFO_FD ) & $at_job_control_off if $at_first; then @@ -1410,7 +1410,9 @@ dnl kill -13 $$ fi shift # Consume one token. if test $...@%:@] -gt 0; then :; else - read at_token <&AT_JOB_FIFO_FD || break + # The 'until' loop avoids a race condition if we happen to open + # the fifo between the time a child outputs a token and it exits. + until read at_token; do :; done <&AT_JOB_FIFO_FD set x $[*] fi test -f "$at_stop_file" && break @@ -1422,7 +1424,8 @@ dnl kill -13 $$ shift for at_job do - read at_token + # Another 'until' loop to avoid the same race condition. + until read at_token; do :; done done <&AT_JOB_FIFO_FD fi exec AT_JOB_FIFO_FD<&-