Flush ports before forking
There are two issues that arise due to output port buffers and forking. If we run Scheme code in a child process, we need to avoid copying buffered output into the child process. Otherwise, the buffered output could be written twice. If we run non-Scheme code (i.e., exec), we need to flush the ports to ensure proper sequencing of writes since the non-Scheme code will not know about the buffered output and will write its output before the buffer gets flushed. * geesh/shell.scm (exec-utility): Flush all ports before forking. (%subshell): Ditto.
This commit is contained in:
parent
9dbf64d740
commit
b92630b39d
|
@ -58,6 +58,11 @@ extra environment variables @var{bindings}. The first argument given
|
||||||
to the new process will be @var{name}, and the rest of the arguments
|
to the new process will be @var{name}, and the rest of the arguments
|
||||||
will be @var{args}."
|
will be @var{args}."
|
||||||
(let ((utility-env (environment->environ env bindings)))
|
(let ((utility-env (environment->environ env bindings)))
|
||||||
|
;; We need to flush all ports here to ensure the proper sequence
|
||||||
|
;; of output. Without flushing, output that we have written could
|
||||||
|
;; stay in a buffer while the utility (which does not know about
|
||||||
|
;; the buffer) produces its output.
|
||||||
|
(flush-all-ports)
|
||||||
(match (primitive-fork)
|
(match (primitive-fork)
|
||||||
(0 (install-current-ports!)
|
(0 (install-current-ports!)
|
||||||
(apply execle path utility-env name args))
|
(apply execle path utility-env name args))
|
||||||
|
@ -193,6 +198,10 @@ by @var{saved-port}, where @var{saved-port} is a return value of
|
||||||
(define* (%subshell thunk)
|
(define* (%subshell thunk)
|
||||||
"Run @var{thunk} in a new process and return the ID of the new
|
"Run @var{thunk} in a new process and return the ID of the new
|
||||||
process."
|
process."
|
||||||
|
;; We need to flush all ports before forking to avoid copying the
|
||||||
|
;; port buffers into the child process, which could lead to
|
||||||
|
;; duplicate output.
|
||||||
|
(flush-all-ports)
|
||||||
(match (primitive-fork)
|
(match (primitive-fork)
|
||||||
(0 (thunk)
|
(0 (thunk)
|
||||||
(primitive-exit))
|
(primitive-exit))
|
||||||
|
|
Loading…
Reference in New Issue