runtime/syncproc: Eliminate spinning, and blocking.
authorMatt Birkholz <matt@birchwood-abbey.net>
Tue, 1 Aug 2017 22:21:01 +0000 (15:21 -0700)
committerMatt Birkholz <matt@birchwood-abbey.net>
Tue, 1 Aug 2017 22:21:01 +0000 (15:21 -0700)
commit316eabf3807e927bbd3005a1f1a6c3016e7bbdf1
tree82c0280123837c5cb63c6ffdfc5c5df54976879c
parentbfaf10c1f0f74f0f886727440267654ce819fa9b
runtime/syncproc: Eliminate spinning, and blocking.

The run-shell-command spins when it is copying both stdin and stdout.
E.g.

    (call-with-input-string "Lorem ipsum dolor sit amet\n"
      (lambda (in)
(run-shell-command "sleep 10; cat" 'input in)))

will keep your machine busy for 10 seconds.

When it is not spinning, the procedure blocks for large bufferfuls.
During the evaluation of

    (run-shell-command
     "i=0; while [ $i -lt 5 ]; do echo $i; i=$[$i + 1]; sleep 1; done"
     'redisplay-hook flush-output-port)

you will not see 5 lines of output, one each second, but all 5 lines
at once after 5 seconds, despite the redisplay hook [Linux 4.10.0
glibc 2.24].

This new copying process eliminates the blocking AND the spinning.  It
keeps stdout in nonblocking mode and uses suspend-current-thread to
block.  It handles short writes too.  The ports sourcing/sinking
stdin/stdout are required to block.
src/runtime/runtime.pkg
src/runtime/syncproc.scm